6

我几乎 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++ 很陌生,所以我可能有错误的文件结构(也许基础应该在头文件中?),如果这样的事情很重要。

4

2 回答 2

13

从不#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。

于 2012-08-04T21:10:54.253 回答
5

正如您所猜测的,您应该将类​​组织在单独的文件中,用于声明(头文件)和定义(.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)
{
}
于 2012-08-04T21:26:15.433 回答