0

C ++が初めてで混乱しています。私は何十もの同様の問題を調べましたが、すべての解決策は#pragma onceorを追加する#ifndef/#define/#endifことですが、私には当てはまらないようです。以下に示すように、三目並べボードのソース ファイルtttBoard.cppがあります。

#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 :

#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

ただし、コンパイル時に次のエラーが発生します。

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

何か案は?

4

3 に答える 3

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 sValtttBoardメンバー変数を再宣言する必要もありません。それらは、ヘッダー ファイルの元の宣言から利用できるはずです。:-)

また、getValue実際に何かを返すように実装されていることを確認してください。これらの関数の実装が完了するまでコンパイルできません。

C++ クラスの詳細については、こちらをご覧ください。

于 2012-09-12T03:49:04.203 に答える
1

ヘッダーと実装ファイルの両方でクラスの定義を提供しています。.cpp には、ヘッダーを含めるだけです。

于 2012-09-12T03:48:10.177 に答える
0

クラスメソッドを定義しようとしていて、.cpp ファイルでクラス自体を再宣言しようとしていると思います。
関数の定義は、.cpp ファイルで次のようにする必要があります。

tttBoard::tttBoard() {
}

void tttBoard::Draw() {
}

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

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

.cpp ファイルで非静的データ メンバーや列挙型などについて再度言及する必要はないことに注意してください。
宣言と定義は、関数に対してのみ別々のセクションに入れることができます。

于 2012-09-12T03:48:55.830 に答える