我是一个尝试编写Menu类的新手,我希望它能够调用属于其他类的函数。我已经在网上彻底寻求,但我发现的答案并不符合我的需求。
这是一段简单的代码,用于定义我的问题:
#include <iostream>
class Class1;//forward declaration
typedef void (Class1::*FunctionPtr_t)();//type: Pointer to a function in Class1 scope
class Class1
{
public:
void function1()
{std::cout << "function1 executed!";}//Test function to execute from Class2
};
class Class2
{
public:
FunctionPtr_t myfcnptr = NULL;//Pointer to a function in Class1
};
int main()
{
Class2 myclass2;
myclass2.myfcnptr = &Class1::function1;//Assign function to pointer (Everything OK here)
(myclass2.*myfcnptr)();//Compilation Error: 'myfcnptr' was not declared in this scope
}
我搞砸了,让两个班级成为朋友,几乎到处都使用范围操作员。我知道解决方案必须非常简单,并且我犯了一个荒谬的错误,但是我没有抓住它!感谢您的耐心等待;)
答案 0 :(得分:1)
正确的语法是(myclass2.*myclass2.myfcnptr)();
。
但在您的情况下,Class1
和Class2
不相关,因此Class2
无法从Class1
明智地调用成员函数。您需要Class1
的实例或从Class1
派生的内容才能执行该调用。
答案 1 :(得分:1)
如果不需要实例化Class1,也可以使方法function1 static
直接从Class2实例调用它。以下代码将编译:
#include <iostream>
typedef void (*FunctionPtr_t)();//PAY ATTENTION TO THE NEW typedef !
class Class1
{
public:
static void function1() //STATIC METHOD
{std::cout << "function1 executed!";}//Test function to execute from Class2
};
class Class2
{
public:
FunctionPtr_t myfcnptr = NULL;//Pointer to a function in Class1
};
int main()
{
Class2 myclass2;
myclass2.myfcnptr = &Class1::function1;//Assign function to pointer
(*(myclass2.myfcnptr))();
}
答案 2 :(得分:0)
您正尝试通过成员函数指针调用成员函数,但您没有指定要调用的Class1
实例。
例如:
FunctionPtr_t func = &Class1::function1;
Class1 instance;
(instance.*func)();
请注意,我必须指定要调用的实例。指针只引用一个函数。这与C#等语言不同,您可以在其中引用一个函数,该引用也跟踪包含该函数的对象。
答案 3 :(得分:0)
最终,您需要利用C ++的类继承系统在两个类Class1
和Class2
之间创建关系;如前所述,Class2
根本无法在没有关系的情况下调用Class1
成员函数。或许,您可以通过在类定义的第一行写下类似内容来Class2
扩展Class1
:
class Class2 : public Class1
{ // ...
您还希望将父类Class1
中的原始函数标记为virtual
,然后在子类Class2
中提供该函数的定义。
了解C ++的类继承,多态,virtual
关键字等的一个很好的资源是http://www.cplusplus.com/doc/tutorial/polymorphism/。