![](/img/trans.png)
[英]In class composition make possible for contained class to access container class variables
[英]How should I access a function of a container class in a contained class object
我有以下课程结构
class containingClass
{
int func1(int a);
containedClass containedClassObject;
}
我想在containedClass
对象中访问func1
。 实现这一目标的最佳方法是什么?
我想到的一个天真的解决方案是通过一个函数指针containedClass
的构造,但后来我进入一个循环定义,因为我需要一个指针传递给一个对象containingClass
为好。
有什么建议么?
所述containedClass
所需的合同/ API /功能由满足int func1(int)
的成员containingClass
。 除非containedClass
明确要求出于其他目的访问containingClass
的实例,否则可以通过lambda(或std::bind
)提供访问,并且containedClass
可以具有std::function
,并且具有正确的签名成员来保存lambda。
唯一的“绝招”这里将是确保对象的生命周期的适当管理,即寿命containingClass
实例只要至少需要在使用containedClassObject
对象。
一个样品;
#include <functional>
class containedClass {
std::function<int(int)> functor_;
public:
void setter(std::function<int(int)> functor) { functor_ = functor; }
};
class containingClass
{
int func1(int a);
containedClass containedClassObject;
public:
containingClass()
{
containedClassObject.setter([this](int a) -> int { return this->func1(a); });
}
};
即使已经超过一岁了,我也想帮助其他的搜索族。
这是另一个使用对包含类的引用的示例。 已使用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
使它可用于引用和指针。 不适用于非引用成员变量之类的实际值。
在class clsEar
到参考clsDog
使用创建clsDog& myDog
。 构造函数可以在初始化列表中设置引用指针。 重要的是,包含类clsDog
必须通过引用传递,否则编译器会告诉您该类不完整。
因为clsEar
现在完全定义的正常成员变量clsEar
可以在被定义clsDog
。 由于clsEar
的构造函数需要对clsDog
的引用,因此必须将其传递给它的构造函数。 这是通过传递*this
在clsDog
的构造函数的初始列表中clsDog
的。
最后但并非最不重要的clsEar::clsEar
必须完成clsEar::clsEar
实现。 在完全定义了clsDog
之后,有必要执行此操作,以调用clsDog
中的clsEar
的成员函数或访问成员变量。 否则,编译器会再次告诉您, clsDog
类的类型不完整。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.