我应该使用main.cpp中包含的哪一个(LNK2005已经定义)



我有以下类:

//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"在编译期间知道BufferWAV_HEADER,这就足够了(这就是您使用#include "Buffer.h"所实现的)。其余部分由链接处理

编译完成后,链接器将合并obj文件。你在不同的翻译中多次定义同一个符号(这里违反了"一个定义规则")把你的类的定义放在一个单独的文件中,这个文件不包含那个类的成员函数的定义;然后,让buffer.cpp和main.cpp包含该文件。

相关内容

  • 没有找到相关文章

最新更新