C ++中跨多个文件的类

时间:2012-08-04 21:06:54

标签: c++

我几乎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 ++的新手,所以我的文件结构可能不对(可能是基础应该在头文件中?),如果这样的话很重要。

2 个答案:

答案 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)
{
}