gpt4 book ai didi

c++ - 指向对象数组中函数的指针数组

转载 作者:太空狗 更新时间:2023-10-29 23:10:38 25 4
gpt4 key购买 nike

我有一个类 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])(); //???
}

最佳答案

“我有一个具有函数数组的 Ghost 类”

这不准确。这些不仅仅是功能;它们是指向成员 函数的指针,它们本身就是独特的野兽。

这段代码中的错误之处。

  1. Func func 应该是 Func *func;

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

  1. 成员访问运算符(operator)错误。

您正在使用 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!!

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

关于c++ - 指向对象数组中函数的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56204690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com