2011-12-01 9 views
5

Mam następujące fragmenty kodu:Dlaczego to daje mi "Niezdefiniowane odniesienia do konstruktorów i destruktorów"?

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; 
} 

Kiedy skompilować MetaDatterTest otrzymuję następujące błędy:

niezdefiniowana odniesienia do Leomedia :: MusicMetaDatter :: MusicMetaDatter (std :: string, Leomedia :: AudioFileType, Leomedia :: FileMode)” niezdefiniowana odniesienia do Leomedia :: MusicMetaDatter :: ~ MusicMetaDatter() ' niezdefiniowane odniesienie do Leomedia :: MusicMetaDatter :: ~ MusicMetaDatter()'

Wszystkie pliki znajdują się w tym samym katalogu. Używam mingw 4.4.1

Czy ktoś może mi w tym pomóc? Ono zaskoczyło mnie nie do poznania.

Odpowiedz

12

Nie podałeś polecenia kompilacji, ale podejrzewam, że brakuje w nim MusicMetaDatter.cpp.

powinno być coś jak

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

skompilować naciskając klawisz F9 bezpośrednio z Code :: Blocks. Jak sprawdzić, jakie polecenie wykonuje dokładnie? –

+0

Nie mam pojęcia, może musisz upewnić się, że oba pliki są dodawane do projektu? Nigdy go nie używałem ... –

+0

Tak, to było to.Nie pracowałem z nimi nad projektem, ale zrobiłem projekt, dodałem je i rozwiązałem problem. Bardzo dziękuję za Twoją pomoc. –

2

Są błędy łącznikowe. Kompilacja była w porządku. Po połączeniu należy utworzyć łącze do kodu zawierającego destruktor dla MusicMetaDatter lub pojawi się ten błąd.

2

Nie są to błędy kompilacji, są one błędem linkerów. Jest to prawdopodobnie dlatego, że zrobiłeś to:

g++ MetaDatterTest.cpp 

zamiast tego

g++ MetaDatterTest.cpp MusicMetaDatter.cpp 

Spróbuj tego!


Teraz będę komentować swojego stylu kodowania:

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

To jest zły styl. Leomedia to przestrzeń nazw, więc napisano Leomedia::MusicMetaDatter, ale nie zapisano Leomedia::AudioFileType i Leomedia::FileMode na liście parametrów.

Lepszy kodowanie stylu to:

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

Zgadzam się z całym sercem, ale czy chodzi o natychmiastowy problem? –

+0

@ MichaelKrelin-hacker: Nie, i też to powiedziałem. – Nawaz

+0

Okay, wygrywasz :) –

Powiązane problemy