Array of Pointer to Function Inside a Array Of Object

时间:2019-05-19 04:11:47

标签: c++ arrays function class pointers

I have a class Ghost that has an array of functions. This class Ghost is an array too. How do I call the functions in main? I cant find a way to call this functions. I have seen some examples but nothing like this.

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])(); //???
}

1 个答案:

答案 0 :(得分:0)

“我有一个具有一系列功能的Ghost类”

那是不正确的。这些不只是功能,还包括功能。它们是指向 member 函数的指针,它们是与众不同的野兽。

此代码中的错误之处。

  1. Func func应该是Func *func;

您拥有它的方式,Func func;声明 a 单个指向成员的变量,并且您显然需要它们的数组。

  1. 成员访问权限操作符错误。

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

  1. func成员的访问不正确。

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

  1. 对象和成员耦合不正确。

使用operator .*将指向对象的指针与具体对象耦合(或使用operator ->*耦合至对象的指针)时,耦合的完整表达式应放在括号中,然后参数列表应放在其自己的括号内。简而言之,只有其中的最后一个才有意义(但由于上述问题过多,仍然无法解决)。

ph[0]->*func[0]();
ph[0]->(*func[0]());
(ph[0]->*func[0])(); // closest to correct

摘要

所有这些之后,我们可以制作出可以实际使用的东西:

#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])();
}

输出

here!!

我离开了随之而来的内存泄漏,并意识到这可能不是您最初想要真正处理的体系结构。但这就是您发布的代码的问题和 a 解决方案。