que tienen una clase como esta:C++: ¿auto_ptr + forward declaration?
class Inner;
class Cont
{
public:
Cont();
virtual ~Cont();
private:
Inner* m_inner;
};
en el .cpp, el constructor crea una instancia de Inner
con new
y el destructor delete
es todo. Esto está funcionando bastante bien.
Ahora quiero cambiar este código a utilizar auto_ptr
así escribo:
class Inner;
class Cont
{
public:
Cont();
virtual ~Cont();
private:
std::auto_ptr<Inner> m_inner;
};
Ahora, el constructor inicializa la auto_ptr
y el destructor no hace nada.
Pero no funciona. el problema parece surgir cuando estoy instanciando esta clase. Aparece esta advertencia:
advertencia C4150: eliminación del puntero a tipo incompleto 'Inner'; sin destructor llamado
Bueno, esto es, obviamente, muy mal y entiendo por qué sucede, el compilador no sabe nada de la d'tor de Inner
cuando una instancia de la plantilla de auto_ptr<Inner>
Así que mi pregunta : ¿Hay alguna manera de usar auto_ptr
con una declaración forward como la que hice en la versión que solo usa punteros?
Tener que #include
cada clase que declaro un puntero es una gran molestia y, a veces, simplemente imposible. ¿Cómo se maneja este problema generalmente?
Solía obtener este problema cuando declaraba un destructor vacío (o no lo declaraba) en el archivo de encabezado de la clase Cont. A partir de su ejemplo, parece que lo está haciendo correctamente, pero solo quería resaltar este problema. – rui
El d'tor se declara en el cpp, y aparece la advertencia de la creación del 'auto_ptr' dentro de la clase. – shoosh