C++ C++;共享对象

C++ C++;共享对象,c++,object,shared,C++,Object,Shared,我有四门课A,B,C和D 类A具有类的成员b B 类B具有类c的成员c A有一个成员D*dpointer 必须保留此层次结构(事实上,这是一个GUI,其应用程序、窗口、面板分别为a、B和C) 现在B和C必须使用*dpointer中的方法 作为B和C的成员,还有什么比给予dpointer更优雅的吗?它不好吗?不直接,但您可以在共享的\u ptr中放入D,这将减轻您可能遇到的任何内存管理难题。在这种情况下,您可能应该传递对B和C的引用,而不是指针。正如@Billy ONeil在中所说的,如果可能

我有四门课
A
B
C
D

  • A
    具有类的成员
    b
    B
  • B
    具有类
    c
    的成员
    c
A
有一个成员
D*dpointer

必须保留此层次结构(事实上,这是一个GUI,其应用程序、窗口、面板分别为
a
B
C

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


作为
B
C
的成员,还有什么比给予
dpointer
更优雅的吗?它不好吗?

不直接,但您可以在
共享的\u ptr
中放入D,这将减轻您可能遇到的任何内存管理难题。

在这种情况下,您可能应该传递对
B
C
的引用,而不是指针。正如@Billy ONeil在中所说的,如果可能和适当的话,您应该在
a
中使用a或a(在不了解
D
dpointer
的情况下无法判断)。
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;
};
传递对
B
C
的引用有一个好处,就是可以清楚地表明这两种引用仅用于
D
-对象,但不控制其生命周期,并且使用这些类需要
D
的实例(可以选择指针
NULL
)。如果
B
C
只调用
D
上的
const
方法,您甚至可以传递一个const引用。

实际上,我可能会选择上面提到的共享ptr解决方案。但是这里有一个在C++文学中不经常被提及的问题,比如你在面试问题或脑力测试中发现的那种类型:

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对象


但是,如果你想让其他人能够理解你在做什么,请使用共享的PTR。

为什么要引用指针?为什么不直接存储指针呢?因为您可以在
struct A
中更改
dpointer
,并在
B
C
中获得更改的值。