2012-06-03 3 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, вместо описания вашего собственного (если вы не доказали его непригодность). Если (под) контейнеры упорядочены, но не отсортированы по их идентификатору, то vector или deque, вероятно, будут хорошим выбором. Все контейнеры STL имеют метод size(), который сообщает количество элементов, хранящихся в контейнере.

Вы также не сделали ни одного из ваших участников общедоступным в своей модели. Вам нужно либо сделать их общедоступными, либо предоставить публичным пользователям, либо определить друзей. В качестве модели вы должны, вероятно, определить общедоступные интерфейсы, чтобы впоследствии вы могли изменять свою реализацию, оставив свою модель неповрежденной.

В вашей модели Document выглядит точно так же, как Container, за исключением 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; } 
}; 
+1

Я бы переименовал 'DocumentBase' в' ContainerOwner' или что-то подобное. Это странное высказывание: «контейнер * - это база документов *. –

+0

@MikeDeSimone, спасибо за предложение. Сделано редактирование. – jxh

Смежные вопросы