1

私は次のクラスを持っています:

// Buffer.cpp

#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()
{
}
(...)

// Buffer.h

#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()
{
(...)
}

プログラムを実行すると、次のエラーが表示されます。

重大度コード 説明 Project File Line Suppression State Error LNK2005 "public: class MonoSample * __cdecl Buffer::getSample(int)" (?getSample@Buffer@@QEAAPEAVMMonoSample@@H@Z) は Buffer.obj で既に定義されています

重大度コード 説明 Project File Line Suppression State Error LNK2005 "public: class MonoSample * __cdecl Buffer::getFirstSample(void)" (?getFirstSample@Buffer@@QEAAPEAVMMonoSample@@XZ) は Buffer.obj で既に定義されています

(...)

main.cpp に #include "Buffer.cpp" と書いているのが原因だと思いますが、その #include なしでそれを行う方法がわかりません... 使用しない場合、どのように Buffer オブジェクトを使用できますか?この #include がありますか?

ありがとうございました!

4

3 に答える 3

0

main.cpp に #include "Buffer.cpp" と書いていることが原因だと思います

はい。

その #include なしでそれを行う方法がわかりません... この #include がない場合、どのように Buffer オブジェクトを使用できますか?

Visual Studio プロジェクトには、「main.cpp」と「Buffer.cpp」が含まれています。この 2 つは、ビルド中にリンクされます。通常、C++ には 2 フェーズのビルド プロセスがあります。最初にコンパイルし、次にリンクします。

あなたの "main.cpp" がコンパイル中にについて知っている限り、それでBuffer十分です (これがあなたの で達成できることです)。リンケージは残りを処理します。WAV_HEADER#include "Buffer.h"

于 2016-11-04T11:08:31.727 に答える
0

コンパイル後、リンカーは obj ファイルをマージします。同じシンボルが異なる翻訳で複数回定義されています (ここでは「1 つの定義規則」に違反しています)。クラスの定義を、そのクラスのメンバー関数の定義も含まない別のファイルに入れます。次に、buffer.cpp と main.cpp にそのファイルを含めます。

于 2016-11-04T11:08:59.160 に答える