定义具有组合关系的类

Defining a class with composition relationship

本文关键字:关系 组合 定义      更新时间:2023-10-16

一个文档可以有多个容器,每个容器可能有也可能没有子容器。每个容器都有名称和容器 ID。

C++我将其建模如下

 class Container
    {
        string ContainerName;
        int ContainerID;
        int NumberofSubContainers; //number of sub-containers this contain contains
        Container* subcontainerlist;
    };
    class Document
    {
        string DocumentName;
        int NumofContainers; //number of containers document contains
        Container* containerlist;
    };

这种方法是否正确,或者是否有更好的替代方案?

最好使用 STL 提供的容器,而不是描述自己的容器(除非您已证明它不合适)。如果(子)容器已订购,但未按其 ID 排序,则vectordeque可能是不错的选择。所有 STL 容器都有一个size()方法,用于报告容器持有的元素数。

您也没有在模型中公开任何成员。您需要将它们公开,或者提供公共访问器,或者定义朋友。作为模型,您可能应该定义公共接口,以便以后可以自由修改实现,同时保持模型不变。

在您的模型中,除了 ID 之外,Document看起来与Container一模一样,因此可以将其分解掉。

class Container;
typedef std::vector<Container> Containers;
class ContainerOwner
{
protected:
    std::string m_name;
    Containers m_list;
};
class Document : public ContainerOwner
{
public:
    std::string & DocumentName () { return m_name; }
    const std::string & DocumentName () const { return m_name; }
    Containers & ContainerList () { return m_list; }
    const Containers & ContainerList () const { return m_list; }
};
class Container : public ContainerOwner
{
    int m_id;
public:
    std::string & ContainerName () { return m_name; }
    const std::string & ContainerName () const { return m_name; }
    int & ContainerId () { return m_id; }
    int ContainerId () const { return m_id; }
    Containers & SubContainerList () { return m_list; }
    const Containers & SubContainerList () const { return m_list; }
};