我有两个班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
做类的构造函数,以及如何为此做重载运算符?
答案 0 :(得分:2)
coefA[i] = 0.0
构造函数中的PolynomT
赋值出现问题是因为Fraction
没有采用双精度的构造函数,也没有采用双精度的赋值运算符。有几种可能的解决方案。
从std::vector
的原始内存管理更改为coefA
。
std::vector<T> coefA;
// Then resize appropriately in the constructor
这将自动使用默认构造的对象填充所有元素,因此如果使用data == nullptr
,则无需执行任何操作。
另一种可能性是将分配更改为
coefA[i] = T();
这将为类型分配一个默认的构造对象(对于double是0.0)。
What are the basic rules and idioms for operator overloading包含有关重载运算符的详细信息。