【问题标题】:creating a c++ class file in both a .h and .cpp file [duplicate]在 .h 和 .cpp 文件中创建 C++ 类文件 [重复]
【发布时间】:2013-12-28 15:58:39
【问题描述】:

作业涉及使用许多类文件来输出图形的体积和面积。

我的程序现在可以完美运行,但是我的老师希望类文件对每个类都使用 .h 和 .cpp 文件。目前我只为每个类使用一个 .h 文件。

不胜感激有关如何将其正确拆分为两个文件的帮助。如果有任何问题,请告诉我!

下面是需要变成.h和.cpp文件的类.h文件之一。

#ifndef CYLINDER_H
#define CYLINDER_H

class Cylinder {
    double height, radius;
    double PI=3.1415926535898;

public:
   void set_values (double,double);
   double volume () {return (radius*radius)*(height)*PI;}
   double area() {return ((2.0000*PI)*(radius)*(radius))+((2.0000*PI)*(radius*height));}

 };

void Cylinder::set_values (double x, double y) {
   height = x;
   radius = y;
 }

  #endif    /* CYLINDER_H */

【问题讨论】:

  • 在你的问题中显示代码示例!!
  • 请编辑您的问题以包含代码。发布文本图像的链接并不是真正完成的事情!
  • 抱歉!修好了
  • 看起来你已经在你的标题中拆分了它,只需将 Cylinder::set_values() 函数移动到 .cpp 文件并包含标题,那么你应该没问题。你应该自己尝试一下。当编译时将其他两个函数移动到 .cpp 中,并以与 set_values() 相同的形式保留原型

标签: c++ class


【解决方案1】:

将代码划分如下:

在 Cylinder.h 中

#ifndef CYLINDER_H
#define CYLINDER_H

class Cylinder {
    double height, radius;
    double PI=3.1415926535898;

public:
   void set_values(double,double);
   double volume();
   double area();    
 };
 #endif    /* CYLINDER_H */

在 Cylinder.cpp 中

#include "Cylinder.h"
void Cylinder::set_values(double x, double y) {
   height = x;
   radius = y;
 }

double Cylinder::volume() {
    return (radius*radius)*(height)*PI;
}
double Cylinder::area() {
    return ((2.0000*PI)*(radius)*(radius))+((2.0000*PI)*(radius*height));
}

这是一个好的做法的原因是一个函数可以声明任意多次,但只定义一次。 void set_values(double,double); 声明函数(注意没有花括号)而

void Cylinder::set_values(double x, double y) { 
   height = x;
   radius = y;
}

定义它。通过将声明和定义分成两个不同的文件,您可以将 cylender.h 包含在许多其他文件中,这样他们就可以使用该类,而不必担心它会在两个地方定义。

实际上在技术上比这更复杂,因为在类的主体内部(大括号之间)定义的函数可以被多次定义,只要所有定义完全相同。这称为单一定义规则或 ODR,它实际上比最初看起来更复杂,因为宏和预处理器实际上可以根据先前定义的内容更改定义。这就是为什么在您完全了解 ODR 和预处理器之前,最好以这种方式将内容划分为 .h 和 .cpp 文件。

这种方法还有一个优点,就是写东西的顺序并不那么重要。如果您先声明所有内容,然后再定义它,那么您就不太可能需要打乱顺序,以便编译器在使用之前知道所有内容。

我还建议阅读有关操作符的信息(例如这里:http://en.wikipedia.org/wiki/Operators_in_C_and_C++),因为你做了很多不需要的括号,我认为你可能会从中受益。例如,在体积中,所有运算符都是从左到右评估的 *,这非常好,所以 radius*radius*height*PI 很好。在区域中它有点复杂,但是因为运算符 * 的优先级高于 + 2.0000*PI*radius*radius+2.0000*PI*radius*height 应该会产生相同的结果。

【讨论】:

  • 体积和面积呢?
  • @claptrap 抱歉我保存的早,我立即更正了
  • 您还需要在 cpp 文件中包含头文件以及使用该类的文件。
  • @PorkyBrain 我在 .h 文件中收到一条错误消息“:set_values(double,double)'。你知道为什么会这样吗?如果很明显,我很抱歉初学者
  • @drescherjm 是的,我应该有这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
相关资源
最近更新 更多