C++ 创建一个c++;在.h和.cpp文件中同时初始化文件

C++ 创建一个c++;在.h和.cpp文件中同时初始化文件,c++,class,C++,Class,作业涉及使用许多类文件来输出图形的体积和面积 我的程序现在运行得很好,但我的讲师希望每个类的类文件都使用.h和.cpp文件。目前,我只为每个类使用一个.h文件 如果您能帮助我们正确地将其拆分为两个文件,我们将不胜感激。如果有任何问题,请告诉我 下面是需要变成.h和.cpp文件的class.h文件之一 #ifndef CYLINDER_H #define CYLINDER_H class Cylinder { double height, radius; double PI=3.

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

我的程序现在运行得很好,但我的讲师希望每个类的类文件都使用.h和.cpp文件。目前,我只为每个类使用一个.h文件

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

下面是需要变成.h和.cpp文件的class.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 */

按如下方式划分代码:

在汽缸里

#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));
}
这是一个很好的实践,因为函数可以被声明任意多次,但只能定义一次<代码>无效设置值(双精度,双精度)声明函数(注意没有大括号),而

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

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

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


我还建议阅读关于算符进动(例如这里:)的内容,因为您正在使用许多不必要的括号,我认为您可能会从中受益。例如,在卷中,所有操作符都是*从左到右求值,这非常好,因此
radius*radius*height*PI
很好。在区域中,它稍微复杂一点,但因为运算符*的优先级高于+
2.0000*PI*radius*radius+2.0000*PI*radius*height
应产生相同的结果。

按如下方式划分代码:

在汽缸里

#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));
}
这是一个很好的实践,因为函数可以被声明任意多次,但只能定义一次<代码>无效设置值(双精度,双精度)声明函数(注意没有大括号),而

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

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

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


我还建议阅读关于算符进动(例如这里:)的内容,因为您正在使用许多不必要的括号,我认为您可能会从中受益。例如,在卷中,所有操作符都是*从左到右求值,这非常好,因此
radius*radius*height*PI
很好。在区域中,它稍微复杂一点,但因为运算符*的优先级高于+
2.0000*PI*radius*radius+2.0000*PI*radius*height
应产生相同的结果。

按如下方式划分代码:

在汽缸里

#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));
}
这是一个很好的实践,因为函数可以被声明任意多次,但只能定义一次<代码>无效设置值(双精度,双精度)声明函数(注意没有大括号),而

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

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

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

我还建议阅读关于算符进动(例如这里:)的内容,因为你做了很多不必要的事情