我很难理解何时/是否应该使用单继承/多继承与正向声明,我想在以下示例中更好地理解它。如果有人能指出我正确的方向,或解释他们之间的差异,那将是无比感激的。

以下是我正在处理的数据结构的示例;

存在1个“父级”,1个“子级”和许多种不同的子级类型。即每个 parent 每个子 parent 有很多 child 。一些 child 需要访问其他 child 对象。 children 将使用彼此相似的功能,即ParseSelf / Display / Save / Edit。如果更改了子项(即“编辑/保存”),则还需要更新SubParent,Parent和其他子项中的数据。

我想知道实现这样的最佳方法是什么?我在下面提出了两种选择。如果需要更多说明/信息,请告诉我。

class SubParent;
class Children;

class Parent
{
    ...
    int iParent;
    SubParent *pSubParent;
};

class SubParent
{
    ...
    int iSubParent;
    std::list<Children> childrenList;
};

class Children
{
    ...
    int iChild;
    int ChildType;
    char *pData;
};

与;
class Parent
{
    ...
    int iParent;
};

class SubParent : public Parent
{
    ...
    int iSubParent;
};

class Children : public SubParent
{
    ...
    int iChild;
    int ChildType;
    char *pData;
};

谢谢。

编辑:
parent 的主要工作;维护有关文件的信息,即SubParent的位置,SubParent大小,包括自身在内的所有数据的总大小。
SubParent的主要工作;包含有关 child 的信息,即 child 的大小和位置。
除了使这些项目保持最新之外, parent /子 parent 都没有做很多其他事情。

最佳答案

我建议采用第一种方法,并进行以下更改:

  • SubParent中添加一个指向Parent的成员。这将允许您双向遍历对象。
    class SubParent
    {
        ...
        int iSubParent;
        Parent* parent;
        std::list<Children> childrenList;
    };
    
  • 如果要使用不同类型的Children*,则应在SubParent中保留一个Chilren列表,而不是Children列表。如果Children永远不会有任何子类,那么拥有Children列表就足够了。
  • SubParent中添加一个指向Children的指针。同样,这将使您可以双向遍历对象。给定一个Children,您将能够通过该指针访问其 sibling 。
    class Children
    {
        ...
        int iChild;
        int ChildType;
        SubParent* subParent;
        char *pData;
    };
    
  • 09-16 10:08