我想做一个以弧度或度数初始化的角度类,但我不知道这是否是个好主意。我在想这样的事情:
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
对象。
通常的解决方案是使用 named constructors :
class Angle
{
public:
static Angle fromRadians( float v );
static Angle fromDegrees( float v );
// ...
private:
Angle( float rad );
// ...
};
不是直接调用构造函数,而是提供具有表达性名称的工厂函数。所以你写:
void f( Angle::fromDegrees( 3.0 ), Angle::fromRadians( 17.0 ) );
关于c++ - 弧度和度数的角度类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12124228/