如何在c ++中调用拥有对象中的方法?

时间:2016-03-26 16:48:31

标签: c++

在c ++中从拥有对象调用拥有对象中的方法的语法是什么?

家长班:

class Parent
{
private:
    Child child;

public:
    Parent()
    {
        addChild(child);
    }

    void MethodToBeCalled(int someArgument)
    {

    }
};

儿童班:

class Child
{
private:
    void myVoid()
    {
        //Call parent method somehow
    }

public:
    Child()
    {

    }
};

我试图让我的问题尽可能简单和通用(尽可能多地受益)。如果我能说得更清楚,请告诉我。

谢谢!

3 个答案:

答案 0 :(得分:3)

这是一个例子。我不得不修改你的代码以使其编译:

class Component {};

class Parent;

class Child   : public Component
{
private:
    inline void myVoid();
    Parent &parent_ref;

public:
    Child(Parent &pr) : parent_ref{pr} {}
};

class Parent   : public Component {
private:
    Child child;

public:
    Parent() : child{*this}
    {
        // addChildComponent(child);
    }

    void MethodToBeCalled(int someArgument)
    {

    }
};

inline void Child::myVoid()
{
    parent_ref.MethodToBeCalled(1);
}

答案 1 :(得分:2)

如果您确定Child对象是Parent类的成员子对象(如您的示例所示),则可以使用container_of技巧(请参阅Understanding container_of macro in the Linux kernel

class Child
{
private:
    void myVoid();
};

class Parent
{
public:
    Child child;

    void MethodToBeCalled(int someArgument)
    {
    }
};

void Child::myVoid()
{
    container_of(this, Parent, child)->MethodToBeCalled(42);
}

显然,这样的技巧会立即限制Child类的可用性,使其始终成为Parent类的成员(至少当您打算在其上调用myVoid()方法时)。

更好的想法是将父对象的引用传递给子对象。

答案 2 :(得分:1)

在您的情况下,您不能,因为ChildParent没有任何共同之处,只是它们都继承ComponentChild必须有Parent个对象才能调用MethodToBeCalled()