C++ 在C+中实现对象模型的库/方法+;

C++ 在C+中实现对象模型的库/方法+;,c++,oop,memory-management,C++,Oop,Memory Management,抱歉如果以前有人问过这个问题,我不太清楚这个术语或者如何提问 我想知道是否有库或最佳实践来实现C++中的对象模型。如果我有一组类,其中这些类的实例可以相互关联,并且可以通过各种方法相互访问,那么我想选择一组好的底层数据结构来管理这些实例及其相互关系。在java中,这很容易,因为它处理内存分配和垃圾收集,但是在C++中我必须自己做。 HTML(DOM)就是一个例子;作为另一个(人为)示例,假设我有以下类: 实体 人(实体的子类) 耦合(实体的子类) 属性 房屋(物业的子类) Pet(属性的子类)

抱歉如果以前有人问过这个问题,我不太清楚这个术语或者如何提问

我想知道是否有库或最佳实践来实现C++中的对象模型。如果我有一组类,其中这些类的实例可以相互关联,并且可以通过各种方法相互访问,那么我想选择一组好的底层数据结构来管理这些实例及其相互关系。在java中,这很容易,因为它处理内存分配和垃圾收集,但是在C++中我必须自己做。 HTML(DOM)就是一个例子;作为另一个(人为)示例,假设我有以下类:

  • 实体
  • (实体的子类)
  • 耦合
    (实体的子类)
  • 属性
  • 房屋
    (物业的子类)
  • Pet
    (属性的子类)
  • Car
    (属性的子类)
这些关系:

  • 实体
    • 拥有一个
      住宅
      类的
      住宅
    • 拥有0个或多个
      Pet
      类别的
      Pet
    • 拥有0辆或更多
      汽车
      类别的
      汽车
    • 拥有0个或多个
  • Person
    • 有0个或1个
      配偶
      属于
      个人
    • 拥有0或1类
      婚姻
      夫妻
    • 具有0或1个类
      实体
      父级
      (在此模型中,如果父级不存在,则父级不存在!)
  • 耦合
    • 拥有2名
      成员
      属于类
  • 属性
    • 拥有一个
      实体的
      所有者
现在我已经考虑了这些对象及其关系,我想开始创建数据结构、方法和字段来处理它们,这就是我迷路的地方,因为我必须处理内存分配和生命周期管理以及所有这些事情。您可能会遇到以下问题:我可能希望将对象放入
std::map
std::vector
中,但如果这样做,我就无法存储指向这些对象的指针,因为它们可以在贴图或向量增大或缩小时重新定位

当我经常使用COM时,我使用的一种方法是拥有一个包含所有内容的隐藏集合。集合中的每个对象都有一个唯一的ID(数字或名称),通过该ID可以从集合中查找该对象,并且每个对象都有一个指向集合的指针。这样,如果您有一个对象想要指向另一个对象,而不是像字面上那样持有指向另一个对象的指针,那么我存储ID并可以通过隐藏集合查找它。我可以使用引用计数自动处理生命周期问题(不相交循环的情况除外,有时这不是问题)

还有其他方法吗?还是有一些库使C++中的这种东西更容易?

编辑:然后您会遇到其他问题,例如对象之间的关系在许多情况下可能是可变的,您必须提前考虑如何存储对对象的引用,以及应提供哪些方法从彼此访问对象。例如,如果我有一个
Person
X的句柄,并且我想表示“查找X的名为George的子对象”的概念,那么我必须存储名称“George”,而不是子对象号:子对象可能存储在向量中,我可能能够调用X.getChildCount()和X.getChild(0),但“George”可能并不总是子对象号0,因为在子向量的“George”之前可能会插入其他子向量。或者X可能有两个、三个或四个孩子,也叫“乔治”。或者“乔治”可能会把他的名字改成“安东尼”或“乔治娜”。在所有这些情况下,最好使用某种唯一的不可变ID

编辑2:(一旦我弄明白了这一点,我将稍微澄清我的问题)我可以处理方法和属性名称的选择,我可以处理是使用映射、列表还是向量。这相当简单。我试图具体解决的问题是:

  • 当一个对象可能是重新分配的数据结构的一部分时,如何让一个对象存储对另一个对象的引用
  • 当对象之间存在交互关系时,如何处理对象生命周期管理

有大约一百万种(保守估计)方法可以实现这一点。你真的在问“如何用C++设计软件”。答案恐怕是,“你的软件将做什么?”——仅仅知道你想与人和房子打交道是不够的。

这不是OOP的全部要点吗?您所要求的是一个实现细节,您隐藏在这些类的公共接口后面,因此不必担心,因为您可以在不更改接口的情况下更改它?所以,去吧,按照你建议的方式去尝试。然后,如果出现性能、内存或其他问题,您可以在不中断其余代码的情况下修复实现


在我看来,将数据存储在数据库中并使用某种对象关系映射可能是另一种选择。

Jason,我最喜欢的数据源是。问题是你在问“我如何使用C++来实现面向对象的编程?” 在SO的回答中,我能说的最好的话是:

所有这些东西都将是C++中的类,关系等看起来就像你曾经使用过的垃圾收集语言: