класс — это правильный способ реализации композиции в C ++?

Сундук состоит из сокровищ.
введите описание изображения здесь
Я реализовал это следующим образом:

treasure.hpp

#pragma once
class Treasure{

public:
protected:
private:

//data members
int gold;

};

chest.hpp

#pragma once
class Chest{

private:
#include "treasure/treasure.hpp"
public:
protected:
private:

//data members
Treasure treasure;

};

** Предположим, что оба заголовочных файла скомпилированы с соответствующими им «.cpp» для создания объектных файлов. *

Уместно ли включать заголовочный файл для сокровищ в объявление класса сундука?
Это имеет смысл для меня, потому что я получаю следующее поведение:
введите описание изображения здесь
** Главная не может создавать или напрямую доступ к Сокровищам. *

#include "chest.hpp"
int main(int argc, char** argv){

Chest chest;
}

Я никогда не видел это таким образом, поэтому я не уверен, что это плохая практика.

Что касается состава, какой метод является предпочтительным:

  1. включая заголовок перед объявлением класса; Имея главное косвенно включать Сокровище?

1

Решение

я мог бы #include "treasure.hpp" в верхней части груди.hpp до Chest объявление класса .. Не все сокровища найдены в сундуке. Если main() хочет создать Сокровище, которое не находится в ChestЭто должно быть разрешено.

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

3

Другие решения

Я хотел бы, чтобы основной включить файл косвенно (сокровища включают в верхней части сундука). Не имеет большого смысла иметь несколько включений. Фактически, это одно из основных применений этих директив прекомпилятора; чтобы предотвратить ошибки компиляции из-за многократного включения файла.

Если вы сделаете это иначе, вы не сможете делать такие вещи, как; создайте новое сокровище и добавьте его в свой сундук или извлеките сокровище из своего сундука и работайте с ним независимо. Эта реализация будет иметь смысл только в том случае, если объект B используется исключительно объектом A.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector