C ++:我有一个包含成员对象(对象B)的基本对象(对象A)。成员对象接口(对象B)需要通过指向对象A的指针完全暴露。最好的方法是什么?我可以将对象作为公共成员放置,但这感觉就像一个黑客。我可以为A中的所有B接口编写包装器,但这感觉很难看。我可以合并对象,但我正在对XML进行类序列化,因此具有不同的类更清晰。我想过朋友分类,但我不认为这适用于这种情况。
解决此类问题的标准方法是什么?
答案 0 :(得分:1)
让B
实现接口IB
。 A
在内部管理B
的实例,并且有一个getter getB
,它返回私有IB
实例的B
接口。如果您想保护B
实例,可以制作IB
方法const
并隐藏析构函数(通过在IB
中将其设为私有)。
class IB {
private:
~IB();
public:
virtual void method1() = 0;
virtual void method2() = 0;
};
class B : public IB {
public:
virtual void method1() {};
virtual void method2() {};
void destruct() { delete this; }
};
class A {
private:
B myB;
public:
IB *getB() { return &myB; }
};
(这只是为了提出一个想法。自从我上次接触C ++以来已经3年多了。我本可以犯一些明显的错误。)
答案 1 :(得分:0)
我拒绝这样做的观点,即这样做是个好主意,但我会把它变成公共成员。如果您不喜欢,可以使用getB()方法。如果可能的话,我会让它返回一个const引用而不是一个普通的引用。
答案 2 :(得分:0)
重载 - >运算符在A和实现中返回类型B的指针变量。 但是如你所知,你将无法通过A的指针和 - >访问A的成员。此外,它有可能导致混淆谁读过代码。 我的意思是这样的。
struct A
{
B *p;
B * operator -> ()
{
return p;
}
};