C ++'class'类型重定义

时间:2014-01-25 17:56:45

标签: c++ class

我第一次尝试使用c ++中的类。我的圈子类和相关的头文件工作正常,然后我移动了一些文件,然后继续得到我在下面显示的错误。

c:\circleobje.cpp(3): error C2011: 'CircleObje' : 'class' type redefinition

c:\circleobje.h(4) : see declaration of 'CircleObje'

CircleObje.h

#ifndef CircleObje_H
#define CircleObje_H
class CircleObje
{
public:
void setCol(float r, float g, float b);
void setCoord(int x, int y);
float getR();
float getG();
float getB();
int getX();
int getY();
};

#endif

CircleObje.cpp

#include "CircleObje.h"

class CircleObje {

float rVal, gVal, bVal;
int xCor, yCor;

public:

void setCol(float r, float g, float b)
{
    rVal = r;
    gVal = g;
    bVal = b;
}

void setCoord(int x, int y)
{
    xCor = x;
    yCor = y;
}

...
};

我没有复制所有.cpp函数,因为我认为它们不相关。在移动文件位置之前,这些文件没有问题。即使重命名后我仍然有与上面相同的错误。有什么想法可以解决问题吗?

4 个答案:

答案 0 :(得分:6)

问题是你正在编译器告诉你两次定义类。在cpp中,您应该提供函数的定义,如:

MyClass::MyClass() {
  //my constructor
}

void MyClass::foo() {
   //foos implementation
}

所以你的cpp应该是这样的:

void CirleObje::setCol(float r, float g, float b)
{
    rVal = r;
    gVal = g;
    bVal = b;
}

void CircleObje::setCoord(int x, int y)
{
    xCor = x;
    yCor = y;
}

...

所有类变量都应该在类的.h文件中定义。

答案 1 :(得分:2)

您在头文件中多次声明您的类,而在.cpp文件中再次声明您的类,这将重新定义您的类。

CircleObje.h

#ifndef CircleObje_H
#define CircleObje_H
class CircleObje
{
public:
void setCol(float r, float g, float b);
void setCoord(int x, int y);
float getR();
float getG();
float getB();
int getX();
int getY();
public:
float rVal, gVal, bVal;
int xCor, yCor;



};

#endif



CircleObje.cpp

#include "CircleObje.h"



void CircleObje::void setCol(float r, float g, float b)
{
    rVal = r;
    gVal = g;
    bVal = b;
}

void CircleObje::setCoord(int x, int y)
{
    xCor = x;
    yCor = y;
}

答案 2 :(得分:1)

您已在头文件和cpp中定义了两次类,因此在.cpp中,编译器会看到两个定义。删除.cpp上类的定义。

类函数应该以这种方式在cpp中实现:

<return_type> <class_name>::<function_name>(<function_parameters>)
{
    ...
}

考虑这个示例类:

//foo.hpp

struct foo
{
    int a;

    void f();
}

该类在foo.cpp文件中实现:

#include "foo.hpp"

void foo::f()
{
    //Do something...
}

答案 3 :(得分:0)

删除class CircleObje {public和结束括号};,它应该有效。您已经在.H中定义了您的类,因此无需在CPP中重新定义它。

此外,您应该编写您的成员实现(在CPP文件中),如下所示:

float CircleObje::getR() { /* your code */ }