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

How should I access a function of a container class in a contained class object

本文关键字:访问 容器类 函数 对象 包含 我应该      更新时间:2023-10-16

>我有以下类结构

class containingClass
{
    int func1(int a);
    containedClass containedClassObject;
}

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

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

有什么建议吗?

containedClass要求合约/API/函数由containingClassint 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之后执行此操作,以调用成员函数或访问clsEarclsDog的成员变体。否则,编译器会再次告诉您,类clsDog是不完整的类型。