如何在C ++中公开成员对象接口

时间:2010-11-19 20:52:57

标签: c++ design-patterns

C ++:我有一个包含成员对象(对象B)的基本对象(对象A)。成员对象接口(对象B)需要通过指向对象A的指针完全暴露。最好的方法是什么?我可以将对象作为公共成员放置,但这感觉就像一个黑客。我可以为A中的所有B接口编写包装器,但这感觉很难看。我可以合并对象,但我正在对XML进行类序列化,因此具有不同的类更清晰。我想过朋友分类,但我不认为这适用于这种情况。

解决此类问题的标准方法是什么?

3 个答案:

答案 0 :(得分:1)

B实现接口IBA在内部管理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;
  }
};