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

时间:2016-06-03 13:10:13

标签: c++ function-pointers

我是一个尝试编写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
}

我搞砸了,让两个班级成为朋友,几乎到处都使用范围操作员。我知道解决方案必须非常简单,并且我犯了一个荒谬的错误,但是我没有抓住它!感谢您的耐心等待;)

4 个答案:

答案 0 :(得分:1)

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

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

class Class2 : public Class1
{  // ...

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

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