C++ 某些文件应该放在哪里#include';这些课程有哪些课程?

C++ 某些文件应该放在哪里#include';这些课程有哪些课程?,c++,C++,我在上弧度课和学位课。每个类都有一个构造函数,它将另一种类型的对象作为参数,进行度/弧度转换,并用结果初始化度或弧度参数,如下所示 Class Radian { private: double radians; public: // ...... Radian(Degree d) { radians = d.getDegrees() * (pi / 180); } // ... 学位课程也是同样的方式,但有

我在上弧度课和学位课。每个类都有一个构造函数,它将另一种类型的对象作为参数,进行度/弧度转换,并用结果初始化度或弧度参数,如下所示

Class Radian
{
    private:
      double radians;
    public:
      // ......
      Radian(Degree d) {
      radians = d.getDegrees() * (pi / 180);
      }
      // ...

学位课程也是同样的方式,但有可能。因此,为了确保没有某种链接错误,每个标题是否应该包含另一个?他们各自的cpp呢?我需要转发类声明吗?

在这种情况下,您应该使用转发声明。

您需要做三件事(可能是四件事):

  • 使用包括防护装置-
    #如果没有弧度…
  • 使用前向声明,即
    类度
  • 将构造函数主体从头文件移出并移到.cpp文件中。这是因为类的前向声明不允许引用成员,如
    getDegrees()
  • 理想情况下,让构造函数接受
    const&
    参数

    • 因为它们紧密地联系在一起,所以它们可能属于一个文件。这使得编写两个内联构造函数成为可能:

      class radian;
      
      class degree {
      public:
          degree(radian r);
      private:
          double degrees;
      };
      
      
      class radian {
      public:
          radian(degree d);
      private:
          double radians;
      };
      
      inline degree::degree(radian r) : degrees(r.get_radians() * 180 / pi) { }
      inline radian::radian(degree d) : radians(d.get_degrees() * pi / 180) { }
      

      我可能会这样做:

      前进.hpp

      #pragma once
      class Radian;
      class Degree;
      
      #pragma once
      #include "forward.hpp"
      
      class Radian {
          public:
              Radian(Degree d);
      
          private:
              double radians;
      };
      
      #include "radian.hpp"
      #include "degree.hpp"
      
      Radian::Radian(Degree d) {
          radians = d.getDegrees() * (pi / 180);
      }
      
      #pragma once
      #include "forward.hpp"
      
      class Degree {
          public:
              Degree(double x);
              double getDegrees() const;
          private:
              double deg;
      }
      
      #include "degree.hpp"
      
      Degree::Degree(double x) {
          deg = x;
      }
      
      double Degree::getDegrees() const {
          return deg;
      }
      
      弧度hpp

      #pragma once
      class Radian;
      class Degree;
      
      #pragma once
      #include "forward.hpp"
      
      class Radian {
          public:
              Radian(Degree d);
      
          private:
              double radians;
      };
      
      #include "radian.hpp"
      #include "degree.hpp"
      
      Radian::Radian(Degree d) {
          radians = d.getDegrees() * (pi / 180);
      }
      
      #pragma once
      #include "forward.hpp"
      
      class Degree {
          public:
              Degree(double x);
              double getDegrees() const;
          private:
              double deg;
      }
      
      #include "degree.hpp"
      
      Degree::Degree(double x) {
          deg = x;
      }
      
      double Degree::getDegrees() const {
          return deg;
      }
      
      弧度cpp

      #pragma once
      class Radian;
      class Degree;
      
      #pragma once
      #include "forward.hpp"
      
      class Radian {
          public:
              Radian(Degree d);
      
          private:
              double radians;
      };
      
      #include "radian.hpp"
      #include "degree.hpp"
      
      Radian::Radian(Degree d) {
          radians = d.getDegrees() * (pi / 180);
      }
      
      #pragma once
      #include "forward.hpp"
      
      class Degree {
          public:
              Degree(double x);
              double getDegrees() const;
          private:
              double deg;
      }
      
      #include "degree.hpp"
      
      Degree::Degree(double x) {
          deg = x;
      }
      
      double Degree::getDegrees() const {
          return deg;
      }
      
      度hpp

      #pragma once
      class Radian;
      class Degree;
      
      #pragma once
      #include "forward.hpp"
      
      class Radian {
          public:
              Radian(Degree d);
      
          private:
              double radians;
      };
      
      #include "radian.hpp"
      #include "degree.hpp"
      
      Radian::Radian(Degree d) {
          radians = d.getDegrees() * (pi / 180);
      }
      
      #pragma once
      #include "forward.hpp"
      
      class Degree {
          public:
              Degree(double x);
              double getDegrees() const;
          private:
              double deg;
      }
      
      #include "degree.hpp"
      
      Degree::Degree(double x) {
          deg = x;
      }
      
      double Degree::getDegrees() const {
          return deg;
      }
      
      degree.cpp

      #pragma once
      class Radian;
      class Degree;
      
      #pragma once
      #include "forward.hpp"
      
      class Radian {
          public:
              Radian(Degree d);
      
          private:
              double radians;
      };
      
      #include "radian.hpp"
      #include "degree.hpp"
      
      Radian::Radian(Degree d) {
          radians = d.getDegrees() * (pi / 180);
      }
      
      #pragma once
      #include "forward.hpp"
      
      class Degree {
          public:
              Degree(double x);
              double getDegrees() const;
          private:
              double deg;
      }
      
      #include "degree.hpp"
      
      Degree::Degree(double x) {
          deg = x;
      }
      
      double Degree::getDegrees() const {
          return deg;
      }
      

      他不能。弧度构造函数(如所写)无法编译。我在再次阅读后注意到了这一点,并标记了答案。很抱歉最好是修复答案而不是标记。@iccthedral他需要两者,还需要将引用另一个类的至少一个类成员函数的实现移动到.cpp文件中。