2011-12-01 9 views
5

Iは、次のコード片を有する:これはなぜ私に "コンストラクタとデストラクタへの未定義の参照"を与えていますか?

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

01 Leomedia :: MusicMetaDatter :: MusicMetaDatter(STD ::文字列、Leomedia :: AudioFileType、Leomedia ::にFileMode「) に未定義の参照に

未定義の参照:私は、私は次のエラーを取得MetaDatterTestコンパイル

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

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

Leomedia :: MusicMetaDatter ::〜MusicMetaDatter() ' Leomedia :: MusicMetaDatter ::〜MusicMetaDatter()の定義されていない参照

すべてのファイルは同じディレクトリにあります。私はmingwを使用しています。4.4.1

誰か助けてもらえますか?それは私の理解を超えて私を唖然とさせました。

答えて

12

コンパイルコマンドを指定していませんが、MusicMetaDatter.cppが不足している可能性があります。

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

。どのコマンドが正確に実行されているかを確認するにはどうすればよいですか? –

+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はパラメータリストに書かれていません。

よりよいコーディングスタイルはこれです:私はコード::ブロックと直接F9キーを押してコンパイル

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

さて、あなたは勝つ:) –

関連する問題