C ++共享对象

时间:2010-04-26 14:46:05

标签: c++ object shared

我有四个课程ABCD

  • 班级A有一个班级成员b B
  • 班级B的成员c属于C

A有一名成员D* dpointer;

必须保留此层次结构(事实上,这是一个带有应用,窗口,面板为ABC)的GUI。

现在B和C必须使用*dpointer中的方法。

作为dpointerB的成员提供C是否更优雅?这不好吗?

4 个答案:

答案 0 :(得分:2)

不是直接的,但你可以将D放在shared_ptr<D>内,这可以减轻你可能遇到的任何内存管理问题。

答案 1 :(得分:1)

struct D;
struct CommonABC
{
   CommonABC(D * & dpointer) : dpointer(dpointer) {}
   D * & dpointer;
};
struct C : CommonABC 
{
   C (const CommonABC & common) : CommonABC(сommon) {}
};
struct B: CommonABC 
{
   B (const CommonABC & common) : CommonABC(сommon), c(common) {}
   C c;
};
struct A 
{
   A () : b(CommonABC(dpointer)) {}
   D * dpointer;
   B b;
};

答案 2 :(得分:1)

在这种情况下,您应该传递对BC的引用,而不是指针。正如@Billy ONeil在his answer中所说,如果可能且适当,您应该使用shared_ptrscoped_ptr(如果不了解Ddpointer,则无法判断)A。 传递对BC的引用有利于明确这两个仅仅使用 D - 对象,但不控制它的生命周期,并且需要D的实例来使用这些类(使用指针NULL是一个选项)。如果BC仅在const上调用D方法,您甚至可以传递const引用。

答案 3 :(得分:1)

实际上,我可能会选择上面提到的shared_ptr解决方案。但这是C ++文献中常见的另一种方式,您可能会在面试问题或BrainBench测试中找到这种方式:

struct D{
  D(int val);
  void foo();
};
struct C:private virtual D{
  void bar(){
    foo();
  } 
};
struct B:private C,private virtual D{
  void car(){
    foo();
  }
};

struct A:private B,private virtual D{   
   A(int val):D(val){}
   void aar(){
    car();
    foo();
   }

};

私有继承实现has-a关系,就像使它成为成员一样。唯一的区别是你只能拥有每种类型中的一种。在这种情况下,组合中的所有类共享相同的D对象。

但如果您希望其他人能够理解您在做什么,请使用shared_ptrs。