在 c++ 中通过指针从另一个类调用类函数

Call class function from another class through pointer in c++

本文关键字:另一个 调用 类函数 指针 c++      更新时间:2023-10-16

我是一个新手,试图编写一个 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)();

但在您的情况下,Class1Class2 是不相关的,因此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++的类继承系统在两个类Class1Class2之间创建关系;如前所述,如果没有关系,Class2根本无法调用Class1成员函数。也许,您可以通过在类定义的第一行编写类似以下内容来使Class2扩展Class1

class Class2 : public Class1
{  // ...

您还需要将父类Class1中的原始函数标记为virtual,然后在子类Class2中提供函数的定义。

了解C++的类继承、多态性、virtual关键字等的一个很好的资源是 http://www.cplusplus.com/doc/tutorial/polymorphism/。