我几乎100%确定我在这两个类中都有正确的语法,但是我遇到了以下错误:
对于CShape.cpp - “错误C2011:'CShape':'类'类型重新定义” 对于CCircle.cpp - “错误CS2504:'CShape':基类未定义”
以下是CShape.cpp的完整代码
#include <iostream>
using namespace std;
class CShape
{
protected:
float area;
virtual void calcArea();
public:
float getArea()
{
return area;
}
}
这是CCircle.cpp的代码
#include <iostream>
#include "CShape.cpp"
#define _USE_MATH_DEFINES
#include "math.h"
using namespace std;
class CCircle : public CShape
{
protected:
int centerX;
int centerY;
float radius;
void calcArea()
{
area = M_PI * (radius * radius);
}
public:
CCircle(int pCenterX, int pCenterY, float pRadius)
{
centerX = pCenterX;
centerY = pCenterY;
radius = pRadius;
}
float getRadius()
{
return radius;
}
}
正如您所看到的,CShape是CCircle继承的基类。我是C ++的新手,所以我的文件结构可能不对(可能是基础应该在头文件中?),如果这样的话很重要。
答案 0 :(得分:11)
永远不要#include .cpp文件;这将导致你得到的那种重新定义错误。相反,在头文件中声明类并且#include那个,并且定义 .cpp文件中的类方法。
// CShape.h
class CShape
{
protected:
float area;
virtual void calcArea();
public:
float getArea();
}
.cpp文件:
// CShape.cpp
#include "CShape.h"
#include <iostream>
using namespace std;
float CShape::getArea() {
return area;
}
您应该类似地拆分CCircle - CCircle.h应该#include CShape.h,而CCircle.cpp应该#include CCircle.h。
答案 1 :(得分:4)
正如您所猜测的,您应该在单独的文件中组织您的类以进行声明(头文件)和定义(.cpp文件)。 您可以在头文件中将成员函数定义(带正文)保留为(建议)内联。 将适当的包含阻止程序放入头文件中,以避免多个类声明。
<强> CShape.h:强>
#ifndef __CSHAPE_H__
#define __CSHAPE_H__
class CShape
{
protected:
float area;
virtual void calcArea();
public:
float getArea()
{
return area;
}
};
#endif
<强> CShape.cpp:强>
#include "CShape.h"
void CShape::calcArea()
{
// Your implementation
}
<强> CCircle.h:强>
#ifndef __CCIRCLE_H__
#define __CCIRCLE_H__
#include "CShape.h"
class CCircle : public CShape
{
protected:
int centerX;
int centerY;
float radius;
virtual void calcArea();
{
area = M_PI * (radius * radius);
}
public:
CCircle(int pCenterX, int pCenterY, float pRadius);
inline float getRadius()
{
return radius;
}
};
#endif
<强> CCircle.cpp:强>
#include "CCircle.h"
CCircle::CCircle(int pCenterX, int pCenterY, float pRadius)
: centerX(pCenterX)
, centerY(pCenterY)
, radius(pRadius)
{
}