2011-12-01 56 views
5

我有下面的代码片段:为什么这给了我“对构造函数和析构函数的未定义引用”?

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

当我编译MetaDatterTest我收到以下错误:

未定义参考Leomedia :: MusicMetaDatter :: MusicMetaDatter(的std :: string,Leomedia :: AudioFileType,Leomedia ::的FileMode)” 未定义参考Leomedia :: MusicMetaDatter ::〜MusicMetaDatter()' 未定义的参考Leomedia :: MusicMetaDatter ::〜MusicMetaDatter()'

所有文件都在同一个目录中。我正在使用mingw 4.4.1

有人可以帮助我吗?它让我无法理解。

回答

12

你没有给你编译命令,但我怀疑它缺少MusicMetaDatter.cpp

应该像

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

我直接用代码::块按F9编译。我如何检查它执行的命令是什么? –

+0

不知道,也许你需要确保两个文件都添加到项目中?我从来没有用过它...... –

+0

是的,就是这样。我并没有和他们一起在一个项目上工作,但我做了一个项目,将它们添加到那里,并解决了这个问题。非常感谢你的帮助。 –

2

这些都是链接错误。它编译得很好。当你链接它时,你需要链接到包含MusicMetaDatter的析构函数的代码,否则你会得到这个错误。

2

这些不是编译错误,它们是链接器错误。这可能是因为你已经这样做了:

g++ MetaDatterTest.cpp 

,而不是这个,

g++ MetaDatterTest.cpp MusicMetaDatter.cpp 

试试这个!


现在我将在你的编码风格注释:

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

这是不好的风格。 Leomedia是一个命名空间,所以你写了Leomedia::MusicMetaDatter,但是你没有在参数列表中写入Leomedia::AudioFileTypeLeomedia::FileMode

更好的编码风格是这样的:

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

我全心全意同意,但它处理眼前的问题? –

+0

@ MichaelKrelin-hacker:不,我也这么说。 – Nawaz

+0

好的,你赢了:) –

相关问题