w*********r 发帖数: 18 | 1 D是W的派生类,现在有两个类A和B分别继承W和D,例如
class A : public W
{
...
}
class B : public D
{
A a;
...
}
那么如何在A的实例里访问B的对象? |
t****t 发帖数: 6806 | 2 啥叫"在A的实例里访问B的对象"?
【在 w*********r 的大作中提到】 : D是W的派生类,现在有两个类A和B分别继承W和D,例如 : class A : public W : { : ... : } : class B : public D : { : A a; : ... : }
|
w*********r 发帖数: 18 | 3 比如说
A的构造函数里怎么访问B的对象?
【在 t****t 的大作中提到】 : 啥叫"在A的实例里访问B的对象"?
|
X****r 发帖数: 3557 | 4 大概是指类似
B* A::getContainerB() {
return (B*)((unsigned char*)this - (size_t)&(((B*)0)->a))
}
这样的。
我建议楼主还是老老实实把B的指针传给A不就完了。
【在 t****t 的大作中提到】 : 啥叫"在A的实例里访问B的对象"?
|
X****r 发帖数: 3557 | 5 A的构造函数里还没有B的对象呢,没法访问。
【在 w*********r 的大作中提到】 : 比如说 : A的构造函数里怎么访问B的对象?
|
w*********r 发帖数: 18 | 6 其实这是个QT的问题,我希望B的对象发射一个信号,然后它包含的A的对象接受这个信
号,但是在A的构造函数里需要用如下函数绑定信号
connect(sender, SIGNAL(foo()),this, SLOT(dosomething()));
这个sender必需是B的实例,可是B的constructor里又先调用A的constructor,我怎么
填这个sender?
【在 X****r 的大作中提到】 : 大概是指类似 : B* A::getContainerB() { : return (B*)((unsigned char*)this - (size_t)&(((B*)0)->a)) : } : 这样的。 : 我建议楼主还是老老实实把B的指针传给A不就完了。
|
g*****g 发帖数: 34805 | 7 Pass the instance of B to A either using a constructor,
or using a setter.
【在 w*********r 的大作中提到】 : D是W的派生类,现在有两个类A和B分别继承W和D,例如 : class A : public W : { : ... : } : class B : public D : { : A a; : ... : }
|
d****p 发帖数: 685 | 8 这个牛。
需要在类设计上保证A只能以B的成员形式存在。
【在 X****r 的大作中提到】 : 大概是指类似 : B* A::getContainerB() { : return (B*)((unsigned char*)this - (size_t)&(((B*)0)->a)) : } : 这样的。 : 我建议楼主还是老老实实把B的指针传给A不就完了。
|
d****p 发帖数: 685 | 9 Thought again and got confused.
To make Xntar's code working, B needs to be defined before A since the code
needs to know B's layout. So A should not be a member object of B - it has
to be a pointer/reference but that invalidates the awesome code :-(
【在 d****p 的大作中提到】 : 这个牛。 : 需要在类设计上保证A只能以B的成员形式存在。
|
X****r 发帖数: 3557 | 10 Not really:
class B;
class A {
B* A::getContainerB();
};
class B {
public: // or friend class A
A a;
};
B* A::getContainerB() {
///...
}
code
has
【在 d****p 的大作中提到】 : Thought again and got confused. : To make Xntar's code working, B needs to be defined before A since the code : needs to know B's layout. So A should not be a member object of B - it has : to be a pointer/reference but that invalidates the awesome code :-(
|
|
|
t****t 发帖数: 6806 | 11 这个写法太野蛮了...
【在 X****r 的大作中提到】 : 大概是指类似 : B* A::getContainerB() { : return (B*)((unsigned char*)this - (size_t)&(((B*)0)->a)) : } : 这样的。 : 我建议楼主还是老老实实把B的指针传给A不就完了。
|
d****p 发帖数: 685 | 12 OK, right.
Never saw code like this but it works :-)
To prevent A's object from being created outside B's object, A ctor has to be
private and the friendship between A and B is needed.
【在 X****r 的大作中提到】 : Not really: : class B; : class A { : B* A::getContainerB(); : }; : class B { : public: // or friend class A : A a; : }; : B* A::getContainerB() {
|
X****r 发帖数: 3557 | 13 我这个其实是作为反面例子的:我估计楼主要的是这个,但是我不建议他做这种事。
把B的指针传过去就完了嘛。
【在 t****t 的大作中提到】 : 这个写法太野蛮了...
|
X****r 发帖数: 3557 | 14 class B {
A* a;
}
这样你就可以推迟A的构建了。
【在 w*********r 的大作中提到】 : 其实这是个QT的问题,我希望B的对象发射一个信号,然后它包含的A的对象接受这个信 : 号,但是在A的构造函数里需要用如下函数绑定信号 : connect(sender, SIGNAL(foo()),this, SLOT(dosomething())); : 这个sender必需是B的实例,可是B的constructor里又先调用A的constructor,我怎么 : 填这个sender?
|
z****e 发帖数: 2024 | 15 是的,其实包括私有权限的,都可以直接访问到。
只要位置移动准确就可以了。所以在某种程度上说,private是形同虚设。
【在 t****t 的大作中提到】 : 这个写法太野蛮了...
|