首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向对象数组内函数的指针数组

指向对象数组内函数的指针数组
EN

Stack Overflow用户
提问于 2019-05-19 12:11:47
回答 1查看 75关注 0票数 3

我有一个Ghost类,它有一个函数数组。这个类Ghost也是一个数组。如何调用main中的函数?我找不到一种方法来调用这个函数。我见过一些例子,但没有这样的例子。

代码语言:javascript
复制
class Ghost;

typedef void(Ghost::* Func)();

class Ghost
{
    public:
    Func func;

    public:

    void init() {};
    void running_random() {};
    void running_afraid() {};
    void dead() {};


    Ghost(){
        func = new Func[5];

        func[0] = &Ghost::init;
        func[1] = &Ghost::random;
        func[2] = &Ghost::running_afraid;
        func[4] = &Ghost::dead;
    }

};


int main()
{
    Ghost ph[4];

    ph[0]->*func[0](); //???
    ph[0]->(*func[0]()); //???
    (ph[0]->*func[0])(); //???
}
EN

回答 1

Stack Overflow用户

发布于 2019-05-19 12:50:05

“我有一个Ghost类,它有一个函数数组”

这是不准确的。这些不只是函数;它们是指向成员函数的指针,这些成员函数是它们自己的不同野兽。

这段代码中错误的地方。

  1. Func func 应该是 Func *func;

按照您的方式,Func func;声明了一个指向成员的单一指针变量,您显然需要它们的一个数组。

  1. Wrong成员-访问operator.

您正在使用operator ->*,它应该用于指向对象的指针,该对象与指向成员的指针相结合。但是你没有指向object的指针。给定Ghost ph[4];,这意味着ph[0]不是Ghost*,而是Ghost。因此,应该使用operator .*

  1. Improper访问 func 成员。

保存成员指针的数组是Ghost的成员。使用成员访问操作符(operator .*operator ->*)并不能神奇地授予对成员func的访问权限。这就是你选择存储那些成员函数指针的地方。这些运算符的行为与operator .operator ->不同

  1. Incorrect对象和成员coupling.

当使用operator .* (或使用operator ->*)将指向成员的指针与具体对象(或使用operator ->*指向对象的指针)耦合时,耦合的完整表达式应该包括在括号中,然后参数列表应该在它自己的括号中。简而言之,只有最后一个是有意义的(但由于上面的过多问题仍然是错误的)。

代码语言:javascript
复制
ph[0]->*func[0]();
ph[0]->(*func[0]());
(ph[0]->*func[0])(); // closest to correct

摘要

在所有这些之后,我们可以制作一些实际有效的东西:

代码语言:javascript
复制
#include <iostream>

class Ghost;
typedef void(Ghost::*Func)();

class Ghost
{
public:
    Func* func;

public:

    void init() {std::cout << "here!!\n"; };
    void running_random() {};
    void running_afraid() {};
    void dead() {};

    Ghost(){
        func = new Func[5];

        func[0] = &Ghost::init;
        func[1] = &Ghost::running_random;
        func[2] = &Ghost::running_afraid;
        func[4] = &Ghost::dead;
    }
};


int main()
{
    Ghost ph[4];

    (ph[0].*ph[0].func[0])();
}

输出

代码语言:javascript
复制
here!!

我留下了随之而来的内存泄漏,并意识到这可能不是您最初真正想要的体系结构,让您来处理。但这些都是问题所在,也是您发布的代码的解决方案。

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

https://stackoverflow.com/questions/56204690

复制
相关文章

相似问题

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