在 C++ 中通过指针从另一个 class 调用 class 函数

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

我是一个尝试编写菜单 class 的新手,我希望它能够调用其他 class 中的函数。在网上找了好久,找到的答案都不符合我的需要。

这是定义我的问题的一段简单的代码:

#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
}

我四处乱逛,结交了 classes 朋友,几乎在任何地方都使用了作用域运算符。我知道解决方案一定很简单,而且我犯了一个荒谬的错误,但我没有明白!感谢您的耐心等待 ;)

正确的语法是(myclass2.*myclass2.myfcnptr)();

但是在你的例子中,Class1Class2 是不相关的,所以 Class2 不能明智地从 Class1 调用成员函数。您需要 Class1 的实例或从 Class1 派生的东西来执行该调用。

您正在尝试通过成员函数指针调用成员函数,但您没有指定要调用的 Class1 实例。

例如:

FunctionPtr_t func = &Class1::function1;
Class1 instance;
(instance.*func)();

请注意,我必须指定要调用的实例。指针只是引用一个函数。这与 C# 等语言不同,在 C# 中您可以引用一个函数,并且该引用还会跟踪包含该函数的对象。

最后,您需要利用 C++ 的 class 继承系统在 class 和 Class1Class2 之间建立关系;如前所述,Class2 根本无法在没有关系的情况下调用 Class1 成员函数。也许,你可以通过在你的 class 定义的第一行写这样的东西来导致 Class2 扩展 Class1

class Class2 : public Class1
{  // ...

您还希望将父 class Class1 中的原始函数标记为 virtual,然后在子 class 中提供该函数的定义 Class2.

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

如果不需要 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))();
}