6

これらのクラスの両方で構文が正しいことはほぼ 100% 確信していますが、次のエラーが発生しています。

CShape.cpp の場合 - 「エラー C2011: 'CShape': 'class' type redefinition」 CCircle.cpp の場合 - 「エラー CS2504: 'CShape': base class undefined」

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

.cpp ファイルを #include しないでください。それはあなたが得ている種類の再定義エラーにつながります。代わりに、ヘッダー ファイルでクラスを宣言し、それを #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 は CShape.h を #include し、CCircle.cpp は CCircle.h を #include する必要があります。

于 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 に答える