我有以下类结构
class containingClass
{
int func1(int a);
containedClass containedClassObject;
}
我想访问func1
个对象中的containedClass
。实现这一目标的最佳方式是什么?
想到一个天真的解决方案是将函数指针传递给containedClass
的构造函数,但随后我进入循环定义,因为我需要将指针传递给{{{ 1}}。
有什么建议吗?
答案 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
的类型不完整。