繁体   English   中英

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

[英]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的引用,因此必须将其传递给它的构造函数。 这是通过传递*thisclsDog的构造函数的初始列表中clsDog的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM