'class'类型重定义,已包含在ifndef / define / endif中

时间:2012-09-12 03:45:30

标签: c++

c ++的新手并且很困惑。我查找了几十个类似的问题,每个解决方案都是添加#pragma once#ifndef/#define/#endif,但对我来说似乎并非如此。我有一个tic tac toe board源文件 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'

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您在标头和实现文件中提供了类的定义。在.cpp中只包含标题。

答案 1 :(得分: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的更多信息。

答案 2 :(得分:0)

我认为您正在尝试定义类方法,并最终在.cpp文件中重新声明类本身。
函数的定义应如下所示:.cpp文件:

tttBoard::tttBoard() {
}

void tttBoard::Draw() {
}

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

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

请注意,您不必再次提及.cpp文件中的非静态数据成员和枚举等。
声明和定义可以仅在功能的单独部分中使用。