我有以下代码:
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)&#39; 未定义参考Leomedia :: MusicMetaDatter :: ~MusicMetaDatter()&#39; 未定义参考Leomedia :: MusicMetaDatter :: ~MusicMetaDatter()&#39;
所有文件都在同一目录中。我使用的是mingw 4.4.1
有人可以帮我吗?它使我无法理解。
答案 0 :(得分:13)
你没有给出编译命令,但我怀疑它中缺少MusicMetaDatter.cpp
。
应该像
g++ -o MetaDatterTest MetaDatterTest.cpp MusicMetaDatter.cpp
答案 1 :(得分:2)
这些是链接器错误。编译得很好。当您链接它时,您需要链接到包含MusicMetaDatter
的析构函数的代码,否则您将收到该错误。
答案 2 :(得分: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::AudioFileType
和Leomedia::FileMode
。
更好的编码风格是:
namespace Leomedia
{
MusicMetaDatter::MusicMetaDatter(std::string fileName, AudioFileType type, FileMode mode)
{
this -> md_fileName = fileName;
this -> md_fileType = type;
this -> md_fileMode = mode;
}
}