我应该如何访问包含的类对象中的容器类的函数

时间:2016-01-27 11:23:24

标签: c++ callback

我有以下类结构

class containingClass
{

    int func1(int a);
    containedClass containedClassObject;
}

我想访问func1个对象中的containedClass。实现这一目标的最佳方式是什么?

想到一个天真的解决方案是将函数指针传递给containedClass的构造函数,但随后我进入循环定义,因为我需要将指针传递给{{{ 1}}。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

containedClass要求int func1(int)的{​​{1}}成员履行合同/ API /功能。除非containingClass明确要求出于其他目的访问containedClass的实例,否则可以通过lambda(或containingClass)提供访问权限,而std::bind可以拥有containedClass {1}}使用包含lambda的正确签名成员。

这里唯一的“技巧”是确保对象的生命周期得到适当管理,即std::function实例的生命周期至少与containingClass中使用的生命周期一样长。对象

样本;

containedClassObject

答案 1 :(得分:0)

即使这已经超过一年了,我也想帮助其他人。

这是另一个使用对包含类的引用的示例。用mingw32-g ++ 4.9.2和-std = c ++ 98测试。意味着它应该也适用于c ++ 0x和c ++ 11

#include <string>
#include <iostream>

using namespace std;

class clsDog;

class clsEar{
    public:
    clsDog& myDog;
    clsEar(clsDog &dog);
};

class clsDog{
    public:
    clsEar ear;
    void pain(string fromPart){
        cout << "dog has pain in his " << fromPart << endl;
    }
    clsDog():ear(*this){};
};

clsEar::clsEar(clsDog &dog): myDog(dog){
    myDog.pain("ear");
}

int main(){
    clsDog dog;
}

首先class clsDog使其可用于参考和指针。对于非参考成员变量等实际值, NOT

class clsEar中,使用clsDog创建了对clsDog& myDog的引用。构造函数可以在初始化列表中设置引用指针。重要的是通过引用传递包含类clsDog,否则编译器会告诉您类不完整。

由于现在clsEar已完全定义,因此clsEar中可以定义clsDog的正常成员变量。因为clsEar的构造函数需要对clsDog的引用,所以它必须传递给它的构造函数。这是通过传递clsDog*this的构造函数的初始化列表中完成的。

最后但并非最不重要的是,必须完成clsEar::clsEar的实施。在clsDog的完整定义之后,有必要在clsDog中调用成员函数或访问clsEar的成员变量。否则,编译器会再次告诉您,类clsDog的类型不完整。