首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++方法指针数组

C++方法指针数组
EN

Stack Overflow用户
提问于 2015-08-23 12:41:19
回答 1查看 204关注 0票数 0

我有一门课有几种方法。现在,我希望这个类有一个方法指针数组,它可以用类的一个实例来调用。

基本上是这样的

代码语言:javascript
复制
class MyClass
{
public:
    MyClass(int aInit);

    typedef int (MyClass::*myPtr)(int);
    const myPtr ptrArray[2];
    const myPtr ptrSingle;

    int plus(int b);
    int minus(int b);

private:
    int a;
};

实现如下所示:

代码语言:javascript
复制
MyClass::MyClass(int aInit) :
    ptrArray({&MyClass::plus, &MyClass::minus}),
    ptrSingle(&MyClass::plus)
{
    this->a = aInit;
}

int MyClass::plus(int b)
{
    return (this->a + b);
}

int MyClass::minus(int b)
{
    return (this->a - b);
}

在另一个类中,我有一个使用MyClass的方法,在该方法中,我尝试访问函数指针成员:

代码语言:javascript
复制
MyClass myInstance(10);
MyClass::myPtr function = myInstance.ptrSingle;
int ret1 = function(1);
int ret2 = myInstance.ptrArray[0](1);
int ret3 = myInstance.ptrArray[1](1);

这将导致以下错误消息:

代码语言:javascript
复制
error: must use '.*' or '->*' to call pointer-to-member function in 'function (...)', e.g. '(... ->* function) (...)'
     int ret1 = function(1);
                          ^
error: must use '.*' or '->*' to call pointer-to-member function in 'myInstance.MyClass::ptrArray[0] (...)', e.g. '(... ->* myInstance.MyClass::ptrArray[0]) (...)'
     int ret2 = *(myInstance.ptrArray[0])(1);
                                           ^
error: must use '.*' or '->*' to call pointer-to-member function in 'myInstance.MyClass::ptrArray[1] (...)', e.g. '(... ->* myInstance.MyClass::ptrArray[1]) (...)'
     int ret3 = myInstance.ptrArray[1](1);
                                        ^
  1. 我不知道把*放在哪里,我也不知道为什么这里需要取消引用。就我记忆中的C语言而言,在调用函数指针时,这是不必要的。我读过它应该是类似于(this->*temp.set_func)(value);的东西,但是我如何使这个语法适应我的问题呢?myInstance不是这个类的成员,所以我没有this。而且,myInstance不是指针,所以我不明白为什么*应该是必需的。有人能帮我吗?
  2. 当我像这样初始化myPtr时,编译器会抱怨too many initializers for 'int (MyClass::* const [0])(int)'。但是,非int类型的初始化不应该在c++11中实现吗?

我在c++11中使用gcc (Gentoo 4.9.3 p1.0,饼-0.6.2) 4.9.3。

EN

回答 1

Stack Overflow用户

发布于 2015-08-23 14:17:28

感谢评论部分的Igor Tandetnik,我现在可以发布对问题1的答复:

代码语言:javascript
复制
MyClass myInstance(10);
MyClass::myPtr function = myInstance.ptrSingle;
MyClass::myPtr functionFromArray = myInstance.ptrArray[1];

int ret1 = (myInstance.*function)(1);
int ret2 = (myInstance.*(myInstance.ptrArray[0]))(1);
int ret3 = (myInstance.*(myInstance.ptrArray[1]))(1);
int ret4 = (myInstance.*functionFromArray)(1);

我的错误是假设方法指针直接指向实例的方法。由于带有ret2和3的行看起来很难看,所以我添加了一个如何访问数组的示例。也许这对其他人有用!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32166753

复制
相关文章

相似问题

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