2012-09-12 39 views
0

新來C++和困惑。我查了幾十個類似的問題,每個解決方案是添加#pragma once#ifndef/#define/#endif,但它似乎並不適合我。我有井字板源文件tttBoard.cpp,如下所示:在編譯我來當'class'類型重定義,已經包含ifndef/define/endif

#ifndef tttBoard_h 
#define tttBoard_h 

class tttBoard { 
    public: 
     tttBoard(); 
     void   Draw(); 
     void   Move(int x, int y); 
     char*   getValue(int x, int y); 
    private: 
     enum sVal { 
     sEmp, 
     sX, 
     sO 
     }; 

     sVal   gBoard[3][3]; 
     bool   isX; 
}; 

#endif 

然而:

#include "stdafx.h" 
#include "tttBoard.h" 
#include <string> 

class tttBoard { 

    enum sVal {sEmp,sX,sO}; 
    sVal gBoard[3][3]; 
    bool isX; 

    tttBoard::tttBoard() { 
    } 

    void Draw() { 
    } 

    void Move(int x, int y) { 
    } 

    char* getValue(int x, int y) {} 

}; 

和相應的頭文件,tttBoard.h跨越以下錯誤:

tttboard.cpp(5): error C2011: 'tttBoard' : 'class' type redefinition 
tttboard.h(4) : see declaration of 'tttBoard' 

任何想法?

回答

1

要實現這個類,您不要重新定義它。請在您的.cpp文件中嘗試以下操作。

#include "tttBoard.h" 

tttBoard::tttBoard() { 
} 

void tttBoard::Draw() { 
} 

void tttBoard::Move(int x, int y) { 
} 

char* tttBoard::getValue(int x, int y) {} 

你也不需要重新聲明你的enum sVal,或任何tttBoard成員變量。它們應該可以從您的頭文件中的原始聲明中獲得。 :-)

此外,請確保getValue實際上返回的東西。在完成這些功能之前,您將無法編譯。

閱讀更多關於C++類here

+0

謝謝!我真的應該先閱讀更多的C++,然後才能開始學習,但這是學校作業所需要的,並沒有得到太多的重視。我認爲我現在理解頭文件好一點了。 – Chris

+0

@Chris沒問題!問問題很好,所以你可以學習。 – oldrinb

+1

不要害怕仔細閱讀你的錯誤信息。 =)這兩條消息告訴了你你做錯了什麼,你在做什麼以及原來的定義在哪裏。 – paddy

1

您正在頭文件和實現文件中提供類的定義。在.cpp中只包含標題。

0

我認爲你正試圖定義類方法,並最終在.cpp文件中重新聲明類本身的。功能
定義應爲在.cpp文件如下:

tttBoard::tttBoard() { 
} 

void tttBoard::Draw() { 
} 

void tttBoard::Move(int x, int y) { 
} 

char* tttBoard::getValue(int x, int y) { return ...; } 

需要注意的是,你不必再提非靜態數據成員和枚舉等在.cpp文件中。
聲明和定義可以在不同的部分僅用於功能。

相關問題