我有两个类Polynom
和Fraction
。
我需要为Polynom
做一个模板,以便使用Fraction
像Polynom
中的系数,例如:3/4 x^0 + 5\6 x^1
等。
我了解如何使用double
或int
这样的简单类型,但是我不知道如何在班级上使用它,也找不到关于该主题的材料。
class Fraction {
private:
int numerator, denominator;
public:
Fraction();
Fraction(int, int);
Fraction(int);
}
template<class T>
class PolynomT {
private:
int degree;
T *coef;
public:
PolynomT();
explicit PolynomT(int, const T * = nullptr);
~PolynomT();
};
template<class T>
PolynomT<T>::PolynomT(int n, const T *data): degree(n) {
coefA = new T[degree+1];
if (data == nullptr) {
for (int i = 0; i < degree+1; ++i)
coefA[i] = 0.0;
}
else {
for (int i = 0; i < degree + 1; ++i)
coefA[i] = data[i];
}
}
/*Problem here*/
int main() {
PolynomT<Fraction> a(); // what need to pass on here in arguments?
// how should the constructor look like?
/*Example*/
PolynomT<Fraction> b();
PolynomT<Fraction> c = a + b; // or something like this.
}
那么,如何在
Fraction
中为PolynomT
做类构造函数,以及如何为此重载运算符? 最佳答案
出现coefA[i] = 0.0
构造函数中的PolynomT
分配问题是因为Fraction
没有采用双精度的构造函数,也不是采用双精度的赋值运算符。有几种可能的解决方案。
从std::vector
从原始内存管理更改为coefA
。
std::vector<T> coefA;
// Then resize appropriately in the constructor
这将自动使用默认的构造对象填充所有元素,因此如果
data == nullptr
则不需要执行任何操作。另一种可能性是将分配更改为
coefA[i] = T();
这将为类型分配一个默认的构造对象(双精度为0.0)。
What are the basic rules and idioms for operator overloading具有有关重载运算符的详细信息。