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
dClass2
使用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的实例化,也可以使方法function1static
并直接从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
的对象来调用该类的成员函数。你真的需要处理函数指针吗?你应该更好地解释你的原始问题和你想要实现的目标。这看起来像