首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++中跨多个文件的类

C++中跨多个文件的类
EN

Stack Overflow用户
提问于 2012-08-05 05:06:54
回答 2查看 24.7K关注 0票数 6

我几乎百分之百确定我在这两个类中的语法都是正确的,但是我得到了以下错误:

对于CShape.cpp - "error C2011:'CShape':' class‘类型重定义“For CCircle.cpp - "error CS2504:'CShape’:基类未定义”

以下是CShape.cpp的完整代码

代码语言:javascript
运行
复制
#include <iostream>
using namespace std;

class CShape
{
protected:
    float area;
    virtual void calcArea();
public:
    float getArea()
    {
        return area;
    }
}

下面是CCircle.cpp的代码

代码语言:javascript
运行
复制
#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++还很陌生,所以我可能会把文件结构弄错(也许基文件应该在一个头文件中?),如果这样的事情很重要。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-05 05:10:54

切勿使用#include .cpp文件;这将导致您遇到的那种重新定义错误。相反,应在头文件中声明类,并在#include中包含该类,并在.cpp文件中定义类方法。

代码语言:javascript
运行
复制
// CShape.h
class CShape
{
protected:
    float area;
    virtual void calcArea();
public:
    float getArea();
}

.cpp文件:

代码语言:javascript
运行
复制
// 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。

票数 13
EN

Stack Overflow用户

发布于 2012-08-05 05:26:15

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

CShape.h:

代码语言:javascript
运行
复制
#ifndef __CSHAPE_H__
#define __CSHAPE_H__
class CShape
{
protected:
    float area;
    virtual void calcArea();
public:
    float getArea()
    {
        return area;
    }
};
#endif

CShape.cpp:

代码语言:javascript
运行
复制
#include "CShape.h"

void CShape::calcArea()
{
    // Your implementation
}

CCircle.h:

代码语言:javascript
运行
复制
#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:

代码语言:javascript
运行
复制
#include "CCircle.h"

CCircle::CCircle(int pCenterX, int pCenterY, float pRadius)
: centerX(pCenterX)
, centerY(pCenterY)
, radius(pRadius)
{
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11812014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档