我有一个具有一系列函数的类幽灵。这个班级鬼是一个数组也是。如何将其称为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])(); //???
}
"我有一个具有函数数组的类幽灵"
这不准确。这些不仅仅是功能;它们是成员函数的指针,它们是独特的野兽。
此代码中的错误。
-
Func func
应该是Func *func;
您的使用方式,Func func;
声明 a 单个指针到成员变量,您显然需要它们的数组。
- 错误的成员-ACCESS操作员。
您使用的是operator ->*
,该指针应用于将其嫁给符合成员指针的指针。但是您没有指向对象的指针。给定Ghost ph[4];
,这意味着ph[0]
不是Ghost*
,它是Ghost
。因此,应使用operator .*
。
-
不当访问
func
成员。
将指针固定给成员的数组是Ghost
的成员。使用成员访问操作员(operator .*
或operator ->*
(,不会神奇地授予对成员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!!
我离开随之而来的内存泄漏,意识到这可能不是您真正想要的架构。但是这些是问题的问题, a 解决了您发布的代码。