C++中跨多个文件的类

Classes across multiple files in C++

本文关键字:文件 C++      更新时间:2023-10-16

我几乎100%确信我在这两个类中都有正确的语法,但我得到了以下错误:

对于CShape.cpp-"错误C2011:'CShape':'class'类型重新定义"对于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++还很陌生,所以如果这样的事情很重要的话,我可能会有错误的文件结构(也许基底应该在头文件中?)。

Never#include.cpp文件;这将导致你所得到的那种重新定义错误。相反,在头文件中声明类并#包含该类,在.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应该#includeCCircle.h.

正如您所猜测的,您应该将类组织在声明(头文件)和定义(.cpp文件)的单独文件中。您可以将成员函数定义(带正文)保留为(建议的)内联在头文件中。在头文件中放入适当的include拦截器,以避免多个类声明。

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