为什么这给了我"Undefined references to constructors and destructors"?

Why is this giving me "Undefined references to constructors and destructors"?

本文关键字:to constructors and destructors references Undefined 为什么      更新时间:2023-10-16

我有以下代码:

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:: audifiletype, Leomedia::FileMode)'对Leomedia::MusicMetaDatter::~MusicMetaDatter()的未定义引用对Leomedia::MusicMetaDatter::~MusicMetaDatter()'的未定义引用

所有的文件都在同一个目录下。我使用的是mingw 4.4.1

有人能帮我一下吗?

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

应该像

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

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

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

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