2011-12-01 10 views
5

tengo los siguientes fragmentos de código:¿Por qué esto me da "referencias indefinidas a constructores y destructores"?

Leomedia.h

#include "MusicMetaDatter.h" 

#ifndef LEOMEDIA_H 
#define LEOMEDIA_H 

namespace Leomedia 
{ 
    typedef enum 
    { 
     read, 
     write 
    } FileMode; 
} 

#endif // LEOMEDIA_H 

MusicMetaDatter.h

#ifndef MUSICMETADATTER_H 
#define MUSICMETADATTER_H 

#include "Leomedia.h" 
#include <string> 

/** 
* METADATTER 
* @Version 1.0.0a 
* @Author: Sergio Andrés Ibañez (Leonnears) 
* @Twitter: Leonnears 
* @Package: Leomedia 
*/ 

    namespace Leomedia 
    { 
     typedef enum 
     { 
      mp3, 
      m4a, 
      flac, 
      ape, 
      wavPack, 
      aiff, 
      wav, 
      ogg, 
      tta 
     } AudioFileType; 

     class MusicMetaDatter 
     { 
      public: 
       MusicMetaDatter(std::string fileName, AudioFileType type, FileMode mode); 
       virtual ~MusicMetaDatter(); 

      private: 
       std::string md_fileName; 
       AudioFileType md_fileType; 
       FileMode md_fileMode; 
     }; 
    } 

    #endif // MUSICMETADATTER_H 

MusicMetaDatter.cpp

#include "MusicMetaDatter.h" 
#include <string> 

Leomedia::MusicMetaDatter::MusicMetaDatter(std::string fileName, AudioFileType type, FileMode mode) 
{ 
    this -> md_fileName = fileName; 
    this -> md_fileType = type; 
    this -> md_fileMode = mode; 
} 

Leomedia::MusicMetaDatter::~MusicMetaDatter() 
{ 
    //dtor 
} 

MetaDatterTest.cpp

#include <iostream> 
#include "Leomedia.h" 
#include <string> 
using namespace std; 

int main() 
{ 
    Leomedia::MusicMetaDatter meta("troll", Leomedia::mp3, Leomedia::read); 
    return 0; 
} 

Cuando compilo MetaDatterTest consigo los siguientes errores: referencia

indefinido a Leomedia :: :: MusicMetaDatter MusicMetaDatter (std :: string, Leomedia :: AudioFileType, Leomedia :: FileMode)' referencia indefinida a Leomedia :: MusicMetaDatter :: ~ MusicMetaDatter() ' referencia indefinida a Leomedia :: MusicMetaDatter :: ~ MusicMetaDatter()'

Todos los archivos están en el mismo directorio. Estoy usando mingw 4.4.1

¿Alguien me puede ayudar con esto? Me ha dejado estupefacto más allá de la comprensión.

Respuesta

12

No ha dado su comando de compilación, pero sospecho que no tiene MusicMetaDatter.cpp en él.

debe ser algo como

g++ -o MetaDatterTest MetaDatterTest.cpp MusicMetaDatter.cpp 
+0

Compilo pulsando F9 directamente con Code :: Blocks. ¿Cómo puedo verificar qué comando está ejecutando exactamente? –

+0

No tengo idea, quizás deba asegurarse de que ambos archivos se agreguen al proyecto. Nunca lo he usado ... –

+0

Sí, eso fue todo.No estaba trabajando con ellos en un proyecto, pero hice un proyecto, los agregué allí y resolví el problema. Muchas gracias por tu ayuda. –

2

Esos son errores de enlace. Compiló bien. Cuando lo vincule, tendrá que enlazar con el código que contiene el destructor para MusicMetaDatter o obtendrá ese error.

2

Esos no son un error de compilación, son un error de enlazador. Es probablemente debido a que usted ha hecho esto:

g++ MetaDatterTest.cpp 

en lugar de esto,

g++ MetaDatterTest.cpp MusicMetaDatter.cpp 

Inténtelo!


Ahora voy a comentar sobre su estilo de codificación:

Leomedia::MusicMetaDatter::MusicMetaDatter(std::string fileName, AudioFileType type, FileMode mode) 
{ 
    this -> md_fileName = fileName; 
    this -> md_fileType = type; 
    this -> md_fileMode = mode; 
} 

Este es un mal estilo. Leomedia es un espacio de nombres, por lo que ha escrito Leomedia::MusicMetaDatter, pero no ha escrito Leomedia::AudioFileType y Leomedia::FileMode en la lista de parámetros.

La mejor codificación de estilo es la siguiente:

namespace Leomedia 
{ 
    MusicMetaDatter::MusicMetaDatter(std::string fileName, AudioFileType type, FileMode mode) 
    { 
     this -> md_fileName = fileName; 
     this -> md_fileType = type; 
     this -> md_fileMode = mode; 
    } 
} 
+0

Estoy totalmente de acuerdo, pero ¿se trata de un problema inmediato? –

+0

@ MichaelKrelin-hacker: No, y lo he dicho también. – Nawaz

+0

De acuerdo, usted gana :) –

Cuestiones relacionadas