C++ 在C+中实现对象模型的库/方法+;
抱歉如果以前有人问过这个问题,我不太清楚这个术语或者如何提问 我想知道是否有库或最佳实践来实现C++中的对象模型。如果我有一组类,其中这些类的实例可以相互关联,并且可以通过各种方法相互访问,那么我想选择一组好的底层数据结构来管理这些实例及其相互关系。在java中,这很容易,因为它处理内存分配和垃圾收集,但是在C++中我必须自己做。 HTML(DOM)就是一个例子;作为另一个(人为)示例,假设我有以下类:C++ 在C+中实现对象模型的库/方法+;,c++,oop,memory-management,C++,Oop,Memory Management,抱歉如果以前有人问过这个问题,我不太清楚这个术语或者如何提问 我想知道是否有库或最佳实践来实现C++中的对象模型。如果我有一组类,其中这些类的实例可以相互关联,并且可以通过各种方法相互访问,那么我想选择一组好的底层数据结构来管理这些实例及其相互关系。在java中,这很容易,因为它处理内存分配和垃圾收集,但是在C++中我必须自己做。 HTML(DOM)就是一个例子;作为另一个(人为)示例,假设我有以下类: 实体 人(实体的子类) 耦合(实体的子类) 属性 房屋(物业的子类) Pet(属性的子类)
实体
(实体的子类)人
(实体的子类)耦合
属性
(物业的子类)房屋
(属性的子类)Pet
(属性的子类)Car
实体
- 拥有一个
住宅
类的
住宅
- 拥有0个或多个
类别的Pet
Pet
- 拥有0辆或更多
汽车
类别的
汽车
- 拥有0个或多个
类
人
- 拥有一个
Person
- 有0个或1个
配偶
属于
个人
- 拥有0或1类
婚姻
夫妻
- 具有0或1个类
实体
的
父级
(在此模型中,如果父级不存在,则父级不存在!)
- 有0个或1个
耦合
- 拥有2名
属于类成员
人
- 拥有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:(一旦我弄明白了这一点,我将稍微澄清我的问题)我可以处理方法和属性名称的选择,我可以处理是使用映射、列表还是向量。这相当简单。我试图具体解决的问题是:
- 当一个对象可能是重新分配的数据结构的一部分时,如何让一个对象存储对另一个对象的引用
- 当对象之间存在交互关系时,如何处理对象生命周期管理
在我看来,将数据存储在数据库中并使用某种对象关系映射可能是另一种选择。Jason,我最喜欢的数据源是。问题是你在问“我如何使用C++来实现面向对象的编程?” 在SO的回答中,我能说的最好的话是: 所有这些东西都将是C++中的类,关系等看起来就像你曾经使用过的垃圾收集语言: