C++ 定义具有组合关系的类

C++ 定义具有组合关系的类,c++,C++,一个文档可以有许多容器,每个容器可能有子容器,也可能没有子容器。每个容器都有名称和容器id 在C++中,我将其建模为 class Container { string ContainerName; int ContainerID; int NumberofSubContainers; //number of sub-containers this contain contains Container* subcontai

一个文档可以有许多容器,每个容器可能有子容器,也可能没有子容器。每个容器都有名称和容器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排序,则
向量
deque
可能是不错的选择。所有STL容器都有一个
size()

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

在您的模型中,
文档
除了ID之外,看起来与
容器
完全相似,因此可以将其分解

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; }
};
类容器;
typedef std::向量容器;
类容器所有者
{
受保护的:
std::字符串m_名称;
集装箱清单;
};
类文档:公共容器所有者
{
公众:
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;}
};
类别容器:公共容器所有者
{
国际货币基金组织;
公众:
std::string&ContainerName(){return m_name;}
const std::string&ContainerName()const{return m_name;}
int&ContainerId(){return m_id;}
int ContainerId()常量{return m_id;}
容器和子容器列表(){return m_list;}
const Containers&subcainerlist()const{return m_list;}
};

正如您所知,通常的做法是只使用大写字母命名类,使用camelCase命名变量和实例。只是格式上的差异。如果您注意到SO的语法突出显示,大写变量名的颜色与camelCase变量名的颜色不同。我还看到过使用带有下划线的
小写字母的成员和方法;C++标准库喜欢这种样式。就我个人而言,我使用C0deH4cker描述的约定,因为它将用户代码与标准库代码区分开来。我将
DocumentBase
重命名为
ContainerOwner
或类似的名称。说“容器就是文档库”有点奇怪@MikeDeSimone,谢谢你的建议。已进行编辑。