C++ 'class'类型重新定义

C++ 'class' type redefinition

本文关键字:定义 类型 class C++ 新定义      更新时间:2023-10-16

我首次尝试与C 的类合作。我的Circle类和关联的标头文件正常工作,然后我移动了一些文件,然后继续遇到一个错误。

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函数,因为我认为它们没有相关性。在我移动文件位置之前,这些文件在没有问题的情况下工作。即使将它们重命名后,我仍然有与上述相同的错误。有任何解决问题的想法吗?

问题在于,就像编译器告诉您的那样,您正在定义两倍。在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文件中定义。

您已经在标题和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...
}

您在标头文件中多次声明您的类

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;
}

删除 class CircleObje {public和结尾括号};,它应该起作用。您已经在.h中定义了类,因此无需在CPP中重新定义它。

另外,您应该像这样编写成员实现(在CPP文件中):

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

您必须将#pragma once放在标题文件的第一行中,然后错误将消失。