2011-12-01 14 views
5

Tôi có mảnh mã sau đây:Tại sao điều này cho tôi "Các tham chiếu không xác định đối với các hàm tạo và các hàm hủy"?

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

Khi tôi biên dịch MetaDatterTest tôi nhận được các lỗi sau đây: tài liệu tham khảo

không xác định để Leomedia :: MusicMetaDatter :: MusicMetaDatter (std :: string, Leomedia :: AudioFileType, Leomedia :: chế độ File)' tài liệu tham khảo không xác định để Leomedia :: MusicMetaDatter :: ~ MusicMetaDatter() ' tham chiếu không xác định đến Leomedia :: MusicMetaDatter :: ~ MusicMetaDatter()'

Tất cả các tệp nằm trong cùng một thư mục. Tôi đang sử dụng mingw 4.4.1

Ai đó có thể giúp tôi với điều này? Nó đã chết lặng tôi ngoài sự hiểu biết.

Trả lời

12

Bạn chưa đưa ra lệnh biên dịch, nhưng tôi nghi ngờ nó thiếu MusicMetaDatter.cpp trong đó.

nên được một cái gì đó giống như

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

tôi biên dịch bằng cách nhấn F9 trực tiếp với Code :: Blocks. Làm cách nào để kiểm tra xem lệnh nào thực thi chính xác? –

+0

Không có ý tưởng, có lẽ bạn cần phải chắc chắn rằng cả hai tập tin được thêm vào dự án? Tôi chưa bao giờ sử dụng nó ... –

+0

Vâng, đúng vậy.Tôi đã không làm việc với họ trong một dự án, nhưng tôi đã thực hiện một dự án, thêm chúng vào đó và giải quyết vấn đề. Cảm ơn sự giúp đỡ của bạn. –

2

Đó là những mối liên kết lỗi. Nó biên dịch tốt. Khi bạn liên kết nó, bạn sẽ cần phải liên kết đến mã có chứa hàm hủy cho MusicMetaDatter hoặc bạn sẽ nhận được lỗi đó.

2

Đó không phải là lỗi biên dịch, chúng là lỗi liên kết. Nó có lẽ là bởi vì bạn đã làm điều này:

g++ MetaDatterTest.cpp 

thay vì điều này,

g++ MetaDatterTest.cpp MusicMetaDatter.cpp 

Hãy thử này!


Bây giờ tôi sẽ nhận xét về phong cách mã hóa của bạn:

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

Đây là phong cách xấu. Leomedia là không gian tên, do đó bạn đã viết Leomedia::MusicMetaDatter, nhưng bạn chưa viết Leomedia::AudioFileTypeLeomedia::FileMode trong danh sách tham số.

Các mã hóa theo phong cách tốt hơn là thế này:

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

Tôi đồng ý hết lòng, nhưng liệu nó có giải quyết vấn đề ngay lập tức? –

+0

@ MichaelKrelin-hacker: Không, và tôi cũng đã nói điều đó. – Nawaz

+0

Ok, bạn thắng :) –

Các vấn đề liên quan