2010-02-26 20 views
5

El siguiente código funciona bien para Visual C++ 2008. Sin embargo, cuando se trata de Visual C++ 6, aparece el siguiente error. Puedo saber por qué y cómo puedo solucionar el error, pero aún así hacer que el destructor permanezca en privado.Por qué se queja Visual C++ 6 en destructor privado

class X 
{ 
public: 
    static X& instance() 
    { 
     static X database; 
     return database; 
    } 

private: 

    X() {}     // Private constructor 
    ~X() {}     // Private destructor 
    X(const X&);    // Prevent copy-construction 
    X& operator=(const X&); // Prevent assignment 
}; 

int main() 
{ 
    X::instance(); 
} 

C: \ Projects \ ttt6 \ main.cpp (178): error C2248: 'X :: ~ X': no ​​se puede miembro privado de acceso declarado en la clase 'X' C: \ Projects \ ttt6 \ main.cpp (175): véase la declaración de 'X :: ~ X'

+0

¿No deberían los constructores/destructores ser siempre públicos? – vpram86

+3

@Aviator: los constructores no siempre deben ser públicos. Ejemplos: para una clase abstracta, solo quieres clases derivadas que llamen al constructor (así puedes evitar la creación de instancias de la clase abstracta), por lo que la haces 'protected'. Para los singletons solo quieres el método estático 'CreateInstance()' de la clase para crear una instancia, por lo que haces que el constructor sea 'private'. –

+0

@Scott: Muchas gracias. Lo entiendo ahora – vpram86

Respuesta

7

La muestra revisada muestra un error del compilador confirmado para VC6: la solución común era simplemente hacer público el destructor.

+0

¿Tiene alguna referencia para qué es este error? –

+0

Me es difícil encontrar mejores referencias que mi memoria o temas más antiguos como http://www.codeguru.com/forum/archive/index.php/t-236067.html –

+1

Este error también se discutió un poco en este SO pregunta: http://stackoverflow.com/questions/2130864/cannot-access-private-member-in-singleton-class-destructor –

4

En fun() está creando un objeto separado, aa y luego copiar el valor de la referencia de objeto devuelto por a::instance() a ella a través del operador de asignación. Esto no funcionará porque tanto el constructor como el destructor son privados. aa debería haber una referencia:

a &aa = a::instance(); 
+0

realmente intenta copiarlo a través del copiador. –

+0

Lo siento. Algún error en mi ejemplo de código. Yo había revisado. El código todavía da error en VC6 pero pasa en VC2008. –

+1

@Yan: No pasa, lo prometo; tu prueba es incorrecta Danos tu código real en lugar de código de ejemplo. – GManNickG

2

Cuando se llega al final de diversión(), la variable pasa de alcance y el destructor será llamado.

Parece que estás intentando implementar un singleton, ¿quizás lo dices en serio?

a & aa = a :: instance();

Si aa es una referencia en lugar de una instancia, el destructor no se invocará al final de fun().

+0

Lo siento. Algún error en mi ejemplo de código. Yo había revisado. El código todavía da error en VC6 pero pasa en VC2008. –

0

Es solo un error de VC6. VC6 tiene muchos errores. Puede usar std :: auto_ptr <> como solución alternativa.

#include <memory> 

class X 
{ 
    friend std::auto_ptr<X>; 
public: 
    static X& instance() 
    { 
     static std::auto_ptr<X> database(new X); 
     return *database; 
    } 
..... 
}; 

Y, por favor, mueva la implementación de instance() al archivo cpp. Lo siento, no recuerdo el caso exacto, pero aún hay otro error de VC6 con la implementación de singleton en los archivos de encabezado. Tuvimos un par de accidentes hace varios años cuando usamos VC6. La solución era mover instancia() implmenetation a cpp.

Cuestiones relacionadas