C++ 通过c++;

C++ 通过c++;,c++,function-pointers,C++,Function Pointers,我是一个尝试编写菜单类的新手,我希望它能够调用属于其他类的函数。我在互联网上进行了彻底的搜索,但我找到的答案不符合我的需要 下面是一段直截了当的代码,它定义了我的问题: #include <iostream> class Class1;//forward declaration typedef void (Class1::*FunctionPtr_t)();//type: Pointer to a function in Class1 scope class Class1 { p

我是一个尝试编写菜单类的新手,我希望它能够调用属于其他类的函数。我在互联网上进行了彻底的搜索,但我找到的答案不符合我的需要

下面是一段直截了当的代码,它定义了我的问题:

#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
}
#包括
一级//远期申报
typedef void(Class1::*FunctionPtr_t)()//类型:指向Class1范围内函数的指针
一班
{
公众:
无效函数1()

{std::cout正确的语法应该是
(myclass2.*.myclass2.myfcnptr)(;


但是在您的情况下,
Class1
Class2
是不相关的,因此
Class2
不能从
Class1
明智地调用成员函数。您需要
Class1
的实例或从
Class1
派生的东西来执行该调用。

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


但是在您的情况下,
Class1
Class2
是不相关的,因此
Class2
不能从
Class1
明智地调用成员函数。您需要
Class1
的实例或从
Class1
派生的东西来执行该调用。

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

例如:

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

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

您试图通过成员函数指针调用成员函数,但未指定g要调用的
Class1
实例

例如:

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

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

最终,您需要在两个类之间创建关系
Class1
d
Class2
使用C++的类继承系统;如前所述,
Class2
无法在没有关系的情况下调用
Class1
成员函数。您可以通过在类定义的第一行编写类似的内容,使
Class2
扩展
Class1
:

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


学习C++类继承、多态性、虚拟关键字等的一个很好的资源是。

最终,您需要利用C++的类继承系统在两个类
Class1
Class2
之间创建一个关系;如前所述,
Class2
可以在没有关系的情况下,不要调用
Class1
成员函数。您可能会在类定义的第一行写下如下内容,从而使
Class2
扩展
Class1

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


学习C++类继承、多态性、虚拟关键字等的一个很好的资源是。

如果不需要Class1的实例化,也可以使方法function1
静态
并直接从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))();
}
#包括
typedef void(*FunctionPtr\u t)(;//注意新的typedef!
一班
{
公众:
静态void function1()//静态方法

{std::cout如果不需要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))();
}
#包括
typedef void(*FunctionPtr\u t)(;//注意新的typedef!
一班
{
公众:
静态void function1()//静态方法

{std::难道你不需要一个
Class1
的对象来调用该类的成员函数吗?你真的需要处理函数指针吗?你应该更好地解释你原来的问题以及你想要实现的目标。这看起来像是一个错误,因为你不清楚为什么需要函数指针以及你发布的代码(无意冒犯)对我来说没什么意义;)。我正在尝试为Arduino项目创建一个菜单,每个菜单选项都会触发一个函数。菜单类是泛型的,因此它必须能够管理泛型函数数组,这些函数最终将在构造过程中指定。但是,一些函数属于其他类。例如,菜单访问数据库ich由数据库类管理,尽管我的菜单类将被传递一个对函数的引用(例如readData)并且必须能够调用它。是否有任何解决方法来处理这种情况?请记住,由于我正在为Arduino编程,我无法实现标准库。您不需要实现标准库,其他人已经为您实现了:P(不幸的是,Arduino不可用)。什么是“情况”?您实际需要什么?呼叫a(非静态)没有对象的成员函数一开始就没有意义。你需要一个
Class1
的对象来调用该类的成员函数。你真的需要处理函数指针吗?你应该更好地解释你的原始问题和你想要实现的目标。这看起来像