2010-05-01 10 views
7

Tengo dos clases, una heredada de la otra. Cuando compilar, obtengo los siguientes errores:C++ LNK2019 error con constructores y destructores en las clases derivadas

Entity.obj: LNK2019 de error: símbolo externo sin resolver "público: __thiscall Utilidad :: Parsables :: Base :: Base (void)" (?? 0Base @ Parsables @ Utility @@ QAE @ XZ) a la que se hace referencia en la función "public: __thiscall Utility :: Parsables :: Entity :: Entity (void)" (?? 0Entity @ Parsables @ Utility @@ QAE @ XZ)

Entity.obj : error LNK2019: símbolo externo no resuelto "public: virtual __thiscall Utility :: Parsables :: Base :: ~ Base (void)" (?? 1Base @ Parsables @ Utility @@ UAE @ XZ) referenciado en la función "public: virtual __thiscall Utility :: Parsables :: Entity :: ~ Entity (void) "(?? 1Entity @ Parsables @ Utility @@ UAE @ XZ)

D: \ Programación \ Projects \ cafeína \ Debug \ Caffeine.exe: error grave LNK1120: 2 externos sin resolver

Realmente no puedo entender lo que está pasando .. puede alguien ver lo que estoy haciendo ¿incorrecto? Estoy usando Visual C++ Express 2008. Aquí están los archivos ..

"include/Utilidad/Parsables/Base.hpp"

#ifndef CAFFEINE_UTILITY_PARSABLES_BASE_HPP 
#define CAFFEINE_UTILITY_PARSABLES_BASE_HPP 

namespace Utility 
{ 
namespace Parsables 
{ 
    class Base 
    { 
    public: 
    Base(void); 
    virtual ~Base(void); 
    }; 
} 
} 

#endif //CAFFEINE_UTILITY_PARSABLES_BASE_HPP 

"src/Utilidad/Parsables/Base.cpp "

#include "Utility/Parsables/Base.hpp" 

namespace Utility 
{ 
namespace Parsables 
{ 
    Base::Base(void) 
    { 
    } 

    Base::~Base(void) 
    { 
    } 
} 
} 

"incluyen/Utilidad/Parsables/Entity.hpp"

#ifndef CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP 
#define CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP 

#include "Utility/Parsables/Base.hpp" 

namespace Utility 
{ 
namespace Parsables 
{ 
    class Entity : public Base 
    { 
    public: 
    Entity(void); 
    virtual ~Entity(void); 
    }; 
} 
} 

#endif //CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP 

"src/Utilidad/Parsables/Entity.cpp"

#include "Utility/Parsables/Entity.hpp" 

namespace Utility 
{ 
namespace Parsables 
{ 
    Entity::Entity(void) 
    { 
    } 

    Entity::~Entity(void) 
    { 
    } 
} 
} 
+0

¿Se incluyen todos estos archivos en el proyecto? ¿Los ves compilar? – shoosh

+0

Sí, están todos incluidos y compilan bien. – BLH

+0

intente deshacerse de los espacios de nombres – shoosh

Respuesta

8

El bit en cuestión es la siguiente:

unresolved external symbol "public: __thiscall Utility::Parsables::Base::Base(void)" 

es necesario proporcionar una definición para Base::Base y Base::~Base. Una declaración no es lo suficientemente buena. Incluso si no tiene nada que hacer en ninguna función, necesita dejar un cuerpo de función vacío, porque C++ en realidad requiere que la función exista. C++ pone cosas como el mantenimiento de tablas virtuales dentro de sus constructores y destructores, por lo que deben definirse incluso si no necesita hacer nada allí: C++ tiene que hacer cosas allí.

¿Estás seguro de que Base.cpp se está incluyendo en la construcción?

+0

Mis archivos fuente tienen definiciones en ellos, dejé un cuerpo de función vacío como usted ha descrito. – BLH

+0

@BLH: Lea mi última oración de nuevo :) (Edité la respuesta aunque no parezca así) –

+0

Acabo de verificar y recordar algo, tengo dos archivos, ambos llamados Base.cpp, pero están en directorios diferentes . Veo una compilación, pero no dos. ¿Podría ser el problema? – BLH

0

Puede ser que su base.cpp no ​​está siendo compilado/vinculados o si tiene un error ortográfico en ella

0

Sólo encontrado con este exacto mismo error hoy en Visual Studio 2015. Por desgracia, la respuesta aceptada no trabajaban (así como respuestas de muchas de las mismas preguntas). Lo que funcionó para mí fue hacer clic derecho en el archivo cpp de la clase base, excluir y luego incluirlo nuevamente. Creo que de alguna manera VS se confundió mientras movía el archivo y cambiaba el nombre y simplemente se negó a compilarlo aunque estaba marcado como "Proyecto Incluido" = verdadero en el editor de propiedades y listado en el archivo vcproj en el grupo. Este es un error horrible y terminó pasando una buena hora en él.

Cuestiones relacionadas