如何在 C++ 中调用另一个对象的方法?

Posted

技术标签:

【中文标题】如何在 C++ 中调用另一个对象的方法?【英文标题】:How to call a method of another object in C++? 【发布时间】:2018-03-31 09:45:59 【问题描述】:

我定义了一个函数指针类型:

typedef void(*Callback)(void);

我在一个类中有一个公共方法:

class HasMethod
    public:
        void MyMethod() // do ....
;

另外一个类有一个函数指针:

class HasFunctionPointer
    public:
        Callback CallbackPointer = 0; // default

并从类中创建两个对象。我想要如下:

int main()
    HasMethod objmethod;
    HasFunctionPointer objfpointer;

    // I want use function pointer of objfpointer to call method of objmethod.
    // When I call :       objfpointer.CallbackPointer();
    // objmethod.MyMethod will run.
    // As delegate in C#.

感谢收看! 请帮帮我!

【问题讨论】:

Callback functions in c++的可能重复 如果你有多个HasMethod对象,objfpointer.CallbackPointer()如何知道调用的是哪个对象? 指向非成员函数的指针与指向成员函数的指针不同。指向非成员函数的指针不需要调用对象,而指向成员函数的指针确实需要。我建议您阅读有关std::functionstd::bind 和lambdas 的更多信息。 嗨@xskxzr!在 C# 中,我确实喜欢这样:objfpointer.Callback = objmethod.MyMethod; 感谢您的建议! @Someprogrammerdude。 【参考方案1】:

在文章的底部有一些解释,然后是一些可能对您的情况有所帮助的替代代码,我建议使用更简单的解决方案,但 C++ 的优点之一是您几乎可以做任何事情。所以:

在C++中,类方法有一个隐藏的第一个参数this指针,这样方法就可以很方便的对调用对象进行操作。方法指针必须能够知道在哪个对象上调用该方法,这使得方法指针有点棘手。这使得普通函数指针与接受相同参数列表的成员方法没有相同的签名,因为类方法的第一个参数自动是 this 指针(静态方法没有this 指针,所以它们在这方面是不同的)。

我认为您的问题大致相当于这个问题: C++: Function pointer to another class function

建议使用接受对象指针的静态方法,以便正确调用对象;使用该静态方法要容易得多。但是您仍然需要知道您正在调用的特定对象。

对于一个做类方法指针的例子,这个问题很好地回答了这个问题,但是你仍然必须取消引用 this 对象才能知道在哪个类上调用指针,这通常发生在同一个类中(使用指针决定从同一类中调用哪个类成员): Calling C++ class methods via a function pointer

同时使用类指针和方法指针的解决方案

如果您真的想从另一个类调用对象的方法,那么您将需要指向您正在调用该方法的对象和您想要调用的方法的指针。这样,您可以将指针切换到不同的对象,并将方法指针切换到不同的方法。我很难为此设想一个用例(除了一些非常边缘的用例),但我很开心把它放在一起——一个实现如下:

#include <iostream>

typedef void(*Callback)(void);

class HasMethod
public:
    void MyMethod() std::cout << "Method run on object";  // do ....
;

typedef void (HasMethod::*MethodCallback)(void);

class HasFunctionPointer
public:
    Callback CallbackPointer = 0; // default
    HasMethod* classToCall = nullptr;
    MethodCallback CallbackPointer2 = 0; // default
;


int main()

    HasMethod objmethod;
    HasFunctionPointer objfpointer;

    objfpointer.CallbackPointer2 = &HasMethod::MyMethod;
    objfpointer.classToCall = &objmethod;
    HasMethod* classObject = objfpointer.classToCall;
    MethodCallback intermed = objfpointer.CallbackPointer2;

    (classObject->*intermed)();

    return 0;

【讨论】:

以上是关于如何在 C++ 中调用另一个对象的方法?的主要内容,如果未能解决你的问题,请参考以下文章

同一类的一个对象如何在 c++ 中分配给同一类的另一个对象? [关闭]

C++工程中如何在一个文件中调用另一个文件中的变量

如何从另一个包装的对象返回 Cython 中的包装 C++ 对象?

如何调用在另一个函数中创建的对象

如何从另一个构造函数调用 C++ 类构造函数 [重复]

QT C++,如何在在一个CPP里直接调用到另一个CPP里的函数