【发布时间】:2012-08-25 17:37:53
【问题描述】:
我想做一个角度类,以弧度或度数进行初始化,但我不知道这是否是个好主意。我正在考虑这样的事情:
class Radian;
class Degree;
/**
* My angle class.
**/
class Angle
{
private:
float m_radian;
public:
explicit Angle(const Radian& rad);
explicit Angle(const Degree& deg);
float GetRadian(void) const
{
return this->m_radian;
}
float GetDegree(void) const
{
return ToDegree(this->m_radian);
}
bool IsEqual(const Angle& angle, float epsilon = 0.001f) const
{
return Abs<float>(this->m_radian - angle.m_radian) < epsilon;
}
void Set(const Angle& ang);
protected:
Angle(void) : m_radian(0.0f)
{}
Angle(float rad) : m_radian(rad)
{}
};
class Radian : public Angle
{
public:
Radian(void)
{}
Radian(float r) : Angle(r)
{}
};
class Degree : public Angle
{
public:
Degree(void)
{}
Degree(float d) : Angle(ToRadian(d))
{}
};
/// Trigonometric functions.
float Sin(const Angle& angle);
...
这样我就不会在我的代码中混淆弧度和度数。但是,这是个好主意还是我应该使用其他设计?
【问题讨论】:
-
如果你有
Angle类,为什么还要有Degree和Radian? -
就我个人而言,我认为这个三角形是一种有趣的模式,它以令人愉快的方式违反了面向对象的原则。我第一次看到它是在埃菲尔,它是复数,从那以后我就爱上了它。
-
@Beta 我的 Angle 类是一个概括。所以,当我想使用角度时,我可以使用 Degree(90) 而不是 Angle(ToRadian(90))。我想要一种不混淆弧度和度数的方法。只使用角度,我可以写出像角度(90)这样的错误。
-
@Jerry Coffin 我会检查一下,谢谢。
-
我认为这样的想法是面向对象的想法在严肃的科学计算中没有产生影响的部分原因。我不会认为单位转换具有足够显着的行为差异来保证两个新课程。
标签: c++ math trigonometry