我应该如何在包含的类对象中访问容器类的函数
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/函数由containingClass
的int func1(int)
成员完成。除非containedClass
明确要求出于其他目的访问containingClass
实例,否则可以通过 lambda(或 std::bind
)提供访问权限,并且containedClass
可以具有包含 lambda 的正确签名成员的std::function
。
这里唯一的"技巧"是确保对象的生存期得到适当的管理,即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& myDog
创建对clsDog
的引用。构造函数可以在初始值设定项列表中设置引用指针。通过引用传递包含类clsDog
非常重要,否则编译器会告诉您该类不完整。
由于clsEar
现已完全定义,因此可以在 clsDog
中定义 clsEar
的正规成员变量。因为clsEar
的构造函数需要引用clsDog
所以必须将其传递给它的构造函数。这是在clsDog
构造函数的初始化器列表中通过传递*this
来完成的。
最后但并非最不重要的是,必须执行clsEar::clsEar
。有必要在完全定义clsDog
之后执行此操作,以调用成员函数或访问clsEar
中clsDog
的成员变体。否则,编译器会再次告诉您,类clsDog
是不完整的类型。
- 用于访问容器<T>数据成员的正确 API
- 通过指向指针数组的指针访问子类的属性
- 为什么此派生对象无法访问基类的后递减方法?
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 访问条件类成员的方法不仅在被调用时才编译
- 如何在C++子类中访问父类的私有变量
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 分段 访问私有类变量时出错
- 访问同级类实例的成员
- 在C++中访问蓝图类组件的正确方法是什么?
- 如何正确实现容器类中元素的更改?
- 无法访问基类函数 C++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 在类组合中,使包含的类可以访问容器类变量
- C 访问容器类方法
- 访问容器类变量的对象 - C++
- 如何在不直接继承的情况下访问基类容器中的派生对象
- 我应该如何在包含的类对象中访问容器类的函数
- 通过基类容器访问派生类唯一变量的最佳方式