我有以下课程:
class A {
// Whatever
};
class B {
T attribute;
A a;
};
现在假设我有以下情况:
A aX, aY;
B bX, bY;
现在,我可以将aX
或aY
“插入”bX
或bY
。
我希望类型A的对象知道它们所处的B,或者换句话说,它们的“超类”B的“attribute
”是什么。
问题:
我希望能够在他们的“超类”B之间自由移动A类对象,我需要一种方式在运行时动态地将B 的属性泄露给它们所以类型A的对象总是知道它们属于哪个B (或者它们当前所处的B的属性是什么)。
最好的方法是什么?
答案 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