Пожалуйста, ознакомьтесь с двумя упрощенными примерами создания агрегации классов ниже.
Решение 1
Заголовок
// need include, forward declaration is not enough
#include "door.h"
class CGarage
{
public:
CGarage(const std::string &val);
private:
CDoor m_door;
};
Источник
#include "garage.h"
CGarage::CGarage(const std::string &val)
:m_door(val)
{
}
Решение 2
Заголовок
#include "smart_ptr.hpp"
// forward declaration
class CDoor;
class CGarage
{
public:
CGarage(const std::string &val);
private:
scoped_ptr<CDoor> m_door;
};
Источник
#include "garage.h"
#include "door.h"
CGarage::CGarage(const std::string &val)
:m_door(new CDoor(val))
{
}
Вопросы, касающиеся создания члена CDoor
Какие преимущества/недостатки вы видите в дизайне примеров (динамическое распределение CDoor и автоматическое распределение)?
Вот что я придумал:
Решение 1:
+ нет проблем с обработкой памяти или временем жизни
+ нет необходимости в дорогостоящем распределении памяти во время выполнения
- нужно добавить дополнительный заголовок (скорость компиляции медленнее?, более тесная связь с CDoor) → многие из них в файлах заголовков считаются плохими...
Решение 2:
+ свободная связь с CDoor в заголовке (требуется только предварительная декларация)
- память должна обрабатываться программистом
Какую конструкцию вы обычно предпочитаете по какой причине?