指针阵列在一个对象数组中函数



我有一个具有一系列函数的类幽灵。这个班级鬼是一个数组也是。如何将其称为MAIN的功能?我找不到一种调用此功能的方法。我看过一些例子,但没有这样的例子。

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. Func func应该是Func *func;

您的使用方式,Func func;声明 a 单个指针到成员变量,您显然需要它们的数组。

  1. 错误的成员-ACCESS操作员。

您使用的是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 解决了您发布的代码。

最新更新