c++ - 指向对象数组内函数的指针数组
问题描述
我有一个具有一系列函数的类 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”
那是不准确的。这些不仅仅是功能;它们是指向成员函数的指针,这些函数对它们自己来说是截然不同的野兽。
这段代码中的错误。
Func func
应该Func *func;
你有它的方式,Func func;
声明一个指向成员变量的指针,你显然想要一个它们的数组。
- 错误的成员访问运算符。
您正在使用operator ->*
,它应该用于指向与指向成员的指针结婚的对象的指针。但是您没有指向对象的指针。鉴于Ghost ph[4];
这意味着ph[0]
不是Ghost*
,它是Ghost
。因此,operator .*
应该使用。
- 会员访问不当
func
。
保存指向成员的指针的数组是 的成员Ghost
。使用成员访问运算符 ( operator .*
or operator ->*
) 不会神奇地授予对 member 的访问权限func
。这就是您选择存储这些成员函数指针的位置。那些运营商的行为不像operator .
和operator ->
- 不正确的对象和成员耦合。
当使用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!!
我留下了随之而来的内存泄漏,并意识到这可能不是你真正想要的架构。但这些是您发布的代码的问题和解决方案。
推荐阅读
- node.js - 没有得到猫鼬模型的响应。find()查询
- python - Pandas 中的同比增长列计算
- karate - 即使定位器在 DOM 中可用,Assert exists().exists 也会返回评估为 false 的断言
- android - 使用地图框:错误(评估'MapboxGL.StyleURL')
- python - 使用 print(", ".join(my_array)) 提取单个字符串并将其添加到 streamlit markdown。我没有得到字符串,而是得到了 NONE
- docker - 在 docker build 中打印 ARG 值
- git - 第一次运行时出现“包 org.junit 不存在”
- sqlite - 即使存在,Sqlite INSERT 也会返回行 ID
- java - 知道为什么 JFrame 会出现这个故障吗?
- node.js - 所有页面都必须使用react吗?