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 中只包含标题。

于 2012-09-12T03:48:10.177 回答
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++ 类的更多信息。

于 2012-09-12T03:49:04.203 回答
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 回答