2012-06-03 29 views
2

文檔可以有多個容器,每個容器可以有也可以不具有子容器。每個容器都有名稱和容器標識。定義具有合成關係的類

在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; 
    }; 

這是正確的做法,也可以有一個更好的替代我已經爲藍本呢?

+3

大家知道,對於只有使用UpperCase命名的類以及使用camelCase命名的變量和實例,這是很常見的做法。只是格式的差異。如果您注意到SO的語法突出顯示,UpperCase變量名稱與camelCase變量名稱不同。 – C0deH4cker

+0

似乎是一個很好的方法。 – james82345

+0

我也看到了寫成'lowercase_with_underscores'的成員和方法; C++標準庫喜歡這種風格。就個人而言,我使用C0deH4cker描述的慣例,因爲它將用戶代碼從標準庫代碼中分離出來。 –

回答

1

最好使用STL提供的容器而不是描述你自己的容器(除非你已經證明它是不合適的)。如果(子)容器是訂購的,但沒有按照他們的ID排序,那麼vectordeque可能是不錯的選擇。所有的STL容器都有一個size()方法來報告容器所擁有的元素的數量。

你也沒有在你的模型中公開你的任何成員。您需要將它們公開,或提供公共訪問者,或定義好友。作爲一個模型,您應該定義公共接口,以便您稍後可以自由修改實現,同時保持模型不變。

在您的模型中,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; } 
}; 
+1

我會將'DocumentBase'重命名爲'ContainerOwner'或類似的東西。這有點奇怪,「一個容器*是一個文檔庫」。 –

+0

@MikeDeSimone,感謝您的建議。編輯已經完成。 – jxh

相關問題