我有以下类:
//buffer .cp
#include "MonoSample.h"
#include "Buffer.h"
#define INBUFFERSIZEBLOCK 1024 // input block size
#define MAXBUFFERSIZE 1000000 // max buffer size (1MB)
#pragma warning (disable : 4996)
using std::endl;
using std::fstream;
Buffer::Buffer()
{
}
(...)
//
#pragma once
#include <string>
using std::string;
typedef struct WAV_HEADER
{
uint8_t RIFF[4];
uint32_t ChunkSize;
uint8_t WAVE[4];
uint8_t fmt[4];
uint32_t Subchunk1Size;
uint16_t audioFormat;
uint16_t numOfChan;
uint32_t samplesPerSec;
uint32_t bytesPerSec;
uint16_t blockAlign;
uint16_t bitsPerSample;
uint8_t Subchunk2ID[4];
uint32_t sampledDataLen;
} wavHdr, *pwavHdr;
class Buffer
{
private:
string wFileNamePath;
int nChannel;
wavHdr head;
unsigned long samplesLen;
unsigned long samplesPte;
FILE* wavFile;
MonoSample* firstSample;
public:
Buffer();
Buffer(string filePath, int id);
~Buffer();
wavHdr getHeader(); // retorna el header del fitxer wav
string getWavFileName(); // retorna el nom del fitxer wav
int getNumChannel(); // retorna el id del fitxer wav
bool ResetBuffer(); // inicia el bufer
void closeBuffer(); // allibera la memoria del buffer
bool openFile(string p, int n); // obre fitxer
MonoSample* getFirstSample(); // punter a la primera mostra mono
MonoSample* getSample(int n); // pointer to 16 bits of the mono sample n
};
//main.cpp
#include "Buffer.cpp"
#include "MonoSample.h"
#include <iostream>
using namespace std;
#define NUMCANALS 16
int main()
{
(...)
}
当我运行程序时,我得到以下错误:
项目文件行抑制状态错误LNK2005 "public: class MonoSample * __cdecl Buffer::getSample(int)"(?getSample@Buffer@@QEAAPEAVMonoSample@@H@Z)已经在Buffer中定义。obj
项目文件行抑制状态错误LNK2005 "public: class MonoSample * __cdecl Buffer::getFirstSample(void)"(?getFirstSample@Buffer@@ qeaapeavmonosample@xz)已经在Buffer中定义。obj
(…)
我认为这是由于在main.cpp中我写了#include "Buffer.cpp",但我不知道没有#include该怎么做。如果我没有这个#include,我怎么能使用Buffer对象?
谢谢!
Main应该开始
#include "Buffer.h"
以便它具有类的定义(但不是所有成员函数的定义)。你几乎从来不会想要#include .cpp文件。
这会产生更多的错误,因为您在Buffer.h中使用了没有在那里定义的类型。解决这个问题的方法是通过添加
来定义它们#include "MonoSample.h"
我认为这是由于我在main.cpp中写了#include "Buffer.cpp"
是的。
我不知道如果没有#include…如果我没有这个#include,我怎么能使用Buffer对象?
你的Visual Studio项目中有"main.cpp"one_answers"Buffer.cpp"。在构建期间,这两个链接在一起。c++通常有两个阶段的构建过程:首先编译,然后链接。
只要您的"main.cpp"在编译期间知道Buffer
和WAV_HEADER
,这就足够了(这就是您使用#include "Buffer.h"
所实现的)。其余部分由链接处理
编译完成后,链接器将合并obj文件。你在不同的翻译中多次定义同一个符号(这里违反了"一个定义规则")把你的类的定义放在一个单独的文件中,这个文件不包含那个类的成员函数的定义;然后,让buffer.cpp和main.cpp包含该文件。