首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取指向对象成员函数的指针

获取指向对象成员函数的指针
EN

Stack Overflow用户
提问于 2012-01-15 06:12:27
回答 4查看 55.9K关注 0票数 34

以下是问题所在:

1)我有一个这样的类:

代码语言:javascript
复制
class some_class
{
public:
    some_type some_value;
    int some_function(double *a, double *b, int c, int d, void *e);
};

2)在some_function中,我使用来自some_class对象的some_values来获得结果。

3)所以,我有一个具体的对象,我想得到一个指向这个对象some_function的指针。

有可能吗?我不能使用some_fcn_ptr,因为这个函数的结果取决于对象的具体some_value

如何获取指向对象的some_function的指针?谢谢。

代码语言:javascript
复制
typedef  int (Some_class::*some_fcn_ptr)(double*, double*, int, int, void*);
EN

回答 4

Stack Overflow用户

发布于 2012-01-15 06:19:39

不,您不能获得指向C++类方法的指针(除非该方法被声明为静态)。原因是一个类方法总是有一个指针this,一个指向类实例的指针。但是如果您通过指针调用该方法,则该指针无法封装this指针,然后将不会附加任何实例,因此此行为是不合法的。

票数 12
EN

Stack Overflow用户

发布于 2012-01-15 06:48:34

您可以编写某种类型的包装器,它既可以使用函数也可以使用方法作为参数。

我使用了以下类来启动函数(它在我的一个SDL程序中使用):

代码语言:javascript
复制
class CallbackFunction {
public:
    // Constructor, copy constructor and destructor

    virtual int execute( SDL_keysym* keysym) const;
    virtual int operator()( SDL_keysym* keysym) const;

protected:
    int( *callback)( SDL_keysym*));
}

int CallbackFunction::execute( SDL_keysym* keysym) const{
    return callback(keysym);
}

int CallbackFunction::operator()( SDL_keysym* keysym) const{
    return callback( keysym);
}

还有这个“方法”的扩展:

代码语言:javascript
复制
template<class T>
class CallbackMethod : public CallbackFunction {
public:
    // Constructor, copy constructor and destructor
    CallbackMethod( T *object, int(T::*callback)( SDL_keysym* keysym));

    int execute( SDL_keysym* keysym) const;
    int operator()(SDL_keysym* keysym) const;

protected:
    T *object;
    int(T::*method)( SDL_keysym* keysym);
};

// Object initialization (constructor)
template<class T>
CallbackMethod<T>::CallbackMethod( T *object, int(T::*callback)( SDL_keysym* keysym)):
    CallbackFunction( NULL),object(object),method(callback){
}


// Responsible for executing
template<class T>
int CallbackMethod<T>::execute( SDL_keysym* keysym) const {
    return (object->*method)(keysym);
}
template<class T>
int CallbackMethod<T>::operator()( keysym) const {
    return (object->*method)( keysym);
}

然后将其用作:

代码语言:javascript
复制
CallbackFunction *callback;
callback = new CallbackFunction( myFunction);
callback = new CallbackMethod<A>( instanceOfA, instanceOfA::myMethod);
callback = new CallbackMethod<B>( instanceOfB, instanceOfB::myMethod);
...
callback( keysym);

我发现宏是这样的:

代码语言:javascript
复制
CALLBACK(object,method) new CallbackMethod<typeof(*object)>( object, &method)

非常有用

票数 11
EN

Stack Overflow用户

发布于 2012-01-15 06:25:31

虽然不完全符合您的要求,但如果您可以使用C++11,以下内容可能会满足您的需求(未经测试):

代码语言:javascript
复制
std::function<int(double*, double*, int, int, void*)>
  some_function_of(Some_class& obj)
{
  return [&](double* a, double* b, int c, int d, void* e){
    return obj.some_func(a, b, c, d, e); };
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8865766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档