在 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)();
。
但是在你的例子中,Class1
和 Class2
是不相关的,所以 Class2
不能明智地从 Class1
调用成员函数。您需要 Class1
的实例或从 Class1
派生的东西来执行该调用。
您正在尝试通过成员函数指针调用成员函数,但您没有指定要调用的 Class1
实例。
例如:
FunctionPtr_t func = &Class1::function1;
Class1 instance;
(instance.*func)();
请注意,我必须指定要调用的实例。指针只是引用一个函数。这与 C# 等语言不同,在 C# 中您可以引用一个函数,并且该引用还会跟踪包含该函数的对象。
最后,您需要利用 C++ 的 class 继承系统在 class 和 Class1
和 Class2
之间建立关系;如前所述,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))();
}
我是一个尝试编写菜单 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)();
。
但是在你的例子中,Class1
和 Class2
是不相关的,所以 Class2
不能明智地从 Class1
调用成员函数。您需要 Class1
的实例或从 Class1
派生的东西来执行该调用。
您正在尝试通过成员函数指针调用成员函数,但您没有指定要调用的 Class1
实例。
例如:
FunctionPtr_t func = &Class1::function1;
Class1 instance;
(instance.*func)();
请注意,我必须指定要调用的实例。指针只是引用一个函数。这与 C# 等语言不同,在 C# 中您可以引用一个函数,并且该引用还会跟踪包含该函数的对象。
最后,您需要利用 C++ 的 class 继承系统在 class 和 Class1
和 Class2
之间建立关系;如前所述,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))();
}