首页 > 解决方案 > 指向对象数组内函数的指针数组

问题描述

我有一个具有一系列函数的类 Ghost。这个类 Ghost 也是一个数组。如何调用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])(); //???
}

标签: c++arraysfunctionclasspointers

解决方案


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

那是不准确的。这些不仅仅是功能;它们是指向成员函数的指针,这些函数对它们自己来说是截然不同的野兽。

这段代码中的错误。

  1. Func func应该Func *func;

你有它的方式,Func func;声明一个指向成员变量的指针,你显然想要一个它们的数组。

  1. 错误的成员访问运算符。

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

  1. 会员访问不当func

保存指向成员的指针的数组是 的成员Ghost。使用成员访问运算符 ( operator .*or operator ->*) 不会神奇地授予对 member 的访问权限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!!

我留下了随之而来的内存泄漏,并意识到这可能不是你真正想要的架构。但这些是您发布的代码的问题和解决方案


推荐阅读