Mire a continuación los dos ejemplos simplificados de diseño de una agregación de clase a continuación.agregación de la clase de diseño: asignación de la pila frente a la asignación de la memoria dinámica
Solución 1
Cabecera
// need include, forward declaration is not enough
#include "door.h"
class CGarage
{
public:
CGarage(const std::string &val);
private:
CDoor m_door;
};
Fuente
#include "garage.h"
CGarage::CGarage(const std::string &val)
:m_door(val)
{
}
Solución 2
Header
#include "smart_ptr.hpp"
// forward declaration
class CDoor;
class CGarage
{
public:
CGarage(const std::string &val);
private:
scoped_ptr<CDoor> m_door;
};
Fuente
#include "garage.h"
#include "door.h"
CGarage::CGarage(const std::string &val)
:m_door(new CDoor(val))
{
}
Las cuestiones relativas a la creación del miembro CDoor
¿Qué ventajas/desventajas que percibe en el diseño de los ejemplos (dinámico asignación de CDoor vs asignación automática)?
Esto es lo que ocurrió:
Solución 1:
+ no hay problemas con el manejo de la memoria o de por vida
+ sin necesidad de asignación de memoria costosa en tiempo de ejecución
- incluyen la necesidad adicional en la cabecera (compilación velocidad más lenta ?, más cerca de acoplamiento a CDoor) -> muchos incluye en los archivos de cabecera se consideran mal ...
Solución 2:
acoplamiento + suelto con CDoor en la cabecera (sólo hacia delante declaración necesario)
- la memoria debe ser manejada por el programador
¿Qué diseño prefiere habitualmente por qué motivo?
La solución 1 no está necesariamente asignada en la pila. Si crea un Garaje a través de nuevo, la puerta también está asignada en el montón. –
@David, tienes razón. Simplemente no pude encontrar palabras mejores para expresar los diferentes tipos para asignar el miembro de CDoor. Abierto para cualquier sugerencia ... – nabulke
@David: El punto es que ambos objetos están asignados en un solo bloque de memoria. Incluso si está en el montón, aún es mejor que 2 asignaciones de montón. – valdo