3

我有以下课程:

class A {
    // Whatever
};

class B {
    T attribute;
    A a;
};

现在假设我有以下情况:

A aX, aY;  
B bX, bY;  

现在我可以“插入”aXaY进入bXbY

我想让 A 类型的对象知道它们在什么 B 中,或者换句话说,attribute它们的“超类”B 的“”是 什么。

问题:

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

最好的方法是什么?

4

4 回答 4

2

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

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

class B {
  B() : a(this) {}
};
于 2012-04-29T14:42:54.157 回答
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;
}

更新:修复了循环指向和循环调用的错误,只能通过友元函数解决。

于 2012-04-29T14:54:12.850 回答
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
于 2012-04-29T14:46:15.730 回答
1

您可以设置指向Bin的指针并使用对inA的引用来直接从对象中获取所需的内容:ABA

#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
于 2012-04-29T15:00:22.827 回答