0

我正在制作弧度课程和学位课程。每个类都有一个构造函数,它接受另一个类型的对象作为参数,进行度数/弧度转换,并用结果初始化度数或弧度参数,就像这样。

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

而学位类的方式相同,但相反。因此,为了确保没有某种链接错误,每个标题是否应该#include 另一个?他们各自的 .cpp 呢?我需要前向类声明吗?

4

4 回答 4

1

你需要做三件事(也许四件事):

  • 使用包含守卫 -#ifndef RADIAN_H...
  • 使用前向声明,即class Degree;
  • 将构造函数主体移出头文件并放入 .cpp 文件。这是因为一个类的前向声明不会让你引用像这样的成员getDegrees()
  • 理想情况下,让构造函数接受const &参数。
于 2013-05-17T15:22:55.900 回答
0

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

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) { }
于 2013-05-17T15:42:48.963 回答
0

在这种情况下,您应该使用前向声明。

于 2013-05-17T15:16:35.917 回答
0

我可能会做以下事情:

转发.hpp

#pragma once
class Radian;
class Degree;

弧度.hpp

#pragma once
#include "forward.hpp"

class Radian {
    public:
        Radian(Degree d);

    private:
        double radians;
};

弧度.cpp

#include "radian.hpp"
#include "degree.hpp"

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

学位.hpp

#pragma once
#include "forward.hpp"

class Degree {
    public:
        Degree(double x);
        double getDegrees() const;
    private:
        double deg;
}

学位.cpp

#include "degree.hpp"

Degree::Degree(double x) {
    deg = x;
}

double Degree::getDegrees() const {
    return deg;
}
于 2013-05-17T15:52:36.407 回答