将类的属性泄露给它的组件

时间:2012-04-29 14:38:39

标签: c++ oop composition

我有以下课程:

class A {
    // Whatever
};

class B {
    T attribute;
    A a;
};

现在假设我有以下情况:

A aX, aY;  
B bX, bY;  

现在,我可以将aXaY“插入”bXbY

我希望类型A的对象知道它们所处的B,或者换句话说,它们的“超类”B的“attribute”是什么。

问题:

我希望能够在他们的“超类”B之间自由移动A类对象,我需要一种方式在运行时动态地将B 的属性泄露给它们所以类型A的对象总是知道它们属于哪个B (或者它们当前所处的B的属性是什么)。

最好的方法是什么?

4 个答案:

答案 0 :(得分:2)

你可以做的一件事是给A指向它的B“父母”:

class A {
public:
  A() : b_(0) {}
  explicit A(B* parent) : b_(parent) {}
private:
  B* b_;
};

class B {
  B() : a(this) {}
};

答案 1 :(得分:2)

也许这很有用(从所有者到属性的指针,反之亦然):

class A;

class B {
    T attribute;
    A* a;
public:
   void setA(A* newA);
   T getAttribute() {return attribute;}
   void setAttribute() {/*some code*/}
};

class A {
   B* Owner;
   friend void B::setA(A* newA);
public:
    void setOwner(B* newOwner) {
        newOwner->setA(this);
    }
};

void B::setA(A* newA)
{
    A* tempA = this->a;
    B* tempB = newA->Owner;

    tempA->Owner = NULL;
    tempB->a = NULL;

    this->a = newA;
    newA->Owner = this;
}

更新:修正了循环定位和循环调用中的错误,只能通过友元函数解决。

答案 2 :(得分:1)

将“B”类定义为接口。制作“getAttribute”方法并将“B”的指针设置为“A”类的实例。现在你可以创建“B”类的子类并为它们添加“A”类,“A”类总是可以知道“B”的属性。

class A 
{
    // Whatever
    B* pointerToB;
    void setB(B* b){ pointerToB = b; }
};

class B 
{
    virtual void someMethod() = 0;
    void addA(A* a)
    {
       a->setB(this);
       this->a = *a;
    }  
    T getAttribute(){ return attribute; }
    T attribute;
    A a;
};

class BB : public B {} // define BB's someMethod version or more method's

答案 3 :(得分:1)

您可以在B中设置指向A的指针,并在A中使用对B的引用,直接从A对象获取您想要的内容:

#include <iostream>

class B;

class A {
    B *_b;
public:
    void setB(B *b) {
        _b = b;
    }

    B *getB() {
        return _b;
    }
};

class B {
    int _attribute;
    A &_a;
public:
    B(A& a, int attribute) : _attribute(attribute), _a(a) {
        _a.setB(this);
    }

    int getAttribute() {
        return _attribute;
    }
};

int main(int argc, const char *argv[])
{
    A a1;
    B b1(a1, 5);

    A a2;
    B b2(a2, 10);

    std::cout << a1.getB()->getAttribute() << std::endl;
    std::cout << a2.getB()->getAttribute() << std::endl;

    return 0;
} 

输出:

5
10