如何在参数模板其他类中使用某个类?

时间:2019-05-15 05:11:08

标签: c++ templates

我有两个班PolynomFraction

我需要为Polynom做一个模板,以便在Fraction中使用Polynom之类的系数,例如:3/4 x^0 + 5\6 x^1等。

我了解如何使用简单的类型,例如doubleint,但是我不知道如何在课堂上使用它,也找不到有关该主题的材料。

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做类的构造函数,以及如何为此做重载运算符?

1 个答案:

答案 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包含有关重载运算符的详细信息。