这是link
的后续帖子我创建了两个类RadAngle和DegAngle,后者继承自前者。由于我想避免重复代码,因此我将DegAngle继承自RadAngle。
注意到在RadAngle中,我想制作
class RadAngle {
...
RadAngle toRad(const DegAngle& dang) {.. do something..} // <-- child class reference
...
}
这可能吗?如果没有,用几乎相同的代码重写两个类是不可避免的?
EDIT01: 这是我现在修改的代码,它不使用两个类,而是使用一个类而不是空结构。但是,我认为它会在toRad中创建其他问题,toDeg检查输入类型是否一致。这是未来的工作:P
template<typename Unit, typename numT>
class Angle {
public:
Angle() {
AngVal = 0.0;
}
Angle(const numT& angV) {
AngVal = angV;
}
void operator = (const Angle<Unit,numT>& ang1) {
AngVal = ang1.getVal();
}
Angle operator+(const Angle<Unit,numT>& ang1) const { return Angle<Unit,numT>(AngVal+ang1.getVal()); }
Angle operator-(const Angle<Unit,numT>& ang1) const { return Angle<Unit,numT>(AngVal-ang1.getVal()); }
Angle operator*(const Angle<Unit,numT>& ang1) const { return Angle<Unit,numT>(AngVal*ang1.getVal()); }
Angle operator/(const Angle<Unit,numT>& ang1) const { return Angle<Unit,numT>(AngVal/ang1.getVal()); }
numT getVal() const { return AngVal;};
Angle<Unit,numT> toRad(const Angle<Unit,numT>& dang) { return dang.getVal() / 180. * M_PI;}
Angle<Unit,numT> toDeg(const Angle<Unit,numT>& dang) { return dang.getVal() / M_PI * 180.;}
private:
numT AngVal;
};
struct Radian;
struct Degree;
int main() {
Angle<Radian,float> a(1.5);
Angle<Radian,float> b(3.5);
Angle<Radian,float> c = a+b;
//std::cout << c << std::endl;
printf("%.2f\n",c.getVal());
Angle<Degree,float> d(45.);
Angle<Degree,float> z = d + Angle<Degree,float>(15.);
printf("%.2f\n",z.getVal());
return 0;
}
答案 0 :(得分:2)
您不需要使用相同的代码编写两个类,您可以使用类模板并让编译器为您“编写”代码。
像这样的事情:
template<typename Unit>
struct Angle
{
// Member functions ...
float magnitude;
};
struct Deg;
struct Rad;
using RadAngle = Angle<Rad>;
using DegAngle = Angle<Deg>;
RadAngle toRadians(const DegAngle& inDegrees)
{
// ...
}
DegAngle toDegrees(const RadAngle& inRadians)
{
// ...
}