在 c++ 中通过指针从另一个类调用类函数
Call class function from another class through pointer in c++
我是一个新手,试图编写一个 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
}
我搞砸了,让两个班级都成为朋友,几乎到处都使用范围运算符。我知道解决方案一定很简单,而且我犯了一个荒谬的错误,但我没有抓住它!感谢您的耐心等待;)
正确的语法是(myclass2.*myclass2.myfcnptr)();
。
但在您的情况下,Class1
和 Class2
是不相关的,因此Class2
无法明智地从 Class1
调用成员函数。你需要一个Class1
实例,或者从Class1
派生的东西来执行该调用。
如果不需要 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))();
}
您正在尝试通过成员函数指针调用成员函数,但未指定要调用的Class1
实例。
例如:
FunctionPtr_t func = &Class1::function1;
Class1 instance;
(instance.*func)();
请注意,我必须指定要调用的实例。指针只引用一个函数。这与 C# 等语言不同,在 C# 中,您可以引用函数,并且该引用还会跟踪包含该函数的对象。
最终,您需要利用C++的类继承系统在两个类Class1
和Class2
之间创建关系;如前所述,如果没有关系,Class2
根本无法调用Class1
成员函数。也许,您可以通过在类定义的第一行编写类似以下内容来使Class2
扩展Class1
:
class Class2 : public Class1
{ // ...
您还需要将父类Class1
中的原始函数标记为virtual
,然后在子类Class2
中提供函数的定义。
了解C++的类继承、多态性、virtual
关键字等的一个很好的资源是 http://www.cplusplus.com/doc/tutorial/polymorphism/。
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 在另一个线程中调用luaL_error会引发qWarning
- 如何在qt中从另一个类调用函数
- 检查哪个对象调用了另一个对象的对象方法
- 如何确定哪个标头调用 c++ 中的另一个标头
- 在另一个函数 (c++) 中调用变量
- 使用另一个程序调用正在运行的 C++ 程序中的函数
- 如何从另一个标头 c++ 调用函数
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 使用指向成员函数的指针在另一个类中调用类构造函数
- 从另一个标头中的标头调用静态方法
- 无法"this"指针传递到另一个类并在 CPP 中调用该类的任何方法
- C++ |DLL / EXE - 如何从导出的类调用另一个类方法?
- 在模板化的 Rcpp 函数中调用另一个 cpp 函数
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 编译器在C++中调用另一个函数时,在参数中查找已删除的构造函数
- 当另一个调用 lambda 使用默认捕获时,lambda 的闭包可能会被破坏吗?
- 在C++中嵌入Python:在Python脚本中导入模块在一个函数调用过程中有效,但在另一个调用过程中无效