Konstruktor klasy podstawowej i szablony funkcji

Konstruktor klasy podstawowej i szablony funkcji
HL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Problem ideowy: Klasa wielomian dziedziczy po klasie lista. Lista jest używana do przechowywania współczynników wielomianu.
Przy inicjalizacji wielomianu kompilator wyrzuca błąd, że nie wie którego przeciążonego konstruktora listy użyć. Jak go przekonać, aby zainicjalizował wielomian tak jak listę, czyli (stopień, wartoś typu T)? Ponadto pola number i item w klasie wielomian były niewidoczne. Wyczytałem, że using list<T>::item za łatwia sprawę, jak jeszcze da się to obejść?

Kopiuj
 
template<class T> class list {
public:
    list(int n=0):number(n), item(n ? new T*[n]:0){}
    list(int n=0, const T&t):number(n),item(n ? new T*[n]:0){
        for(int i=0;i<number;i++)
            item[i]= new T(t);
    }// constructor with T argument
    list(const list<T>& l):number(l.number),item(l.number? new T*[l.number]:0){
    for(int i=0;i<l.number;i++)
        if(l.item[i]) item[i]=new T(*l.item[i]);
    }//copy constructor
    ~list(){
        for(int i =0;i<number;i++)
            delete item[i];
        delete [] item;
    }
    int size() const{
        return number;
    }
    T& operator()(int i){
        if(item[i]) return *(item[i]);
    } // read-write operator
    const T& operator[](int i){
        if(item[i]) return *(item[i]);
    } // read-only item
    const list<T>& operator=(const list<T>&l){
    if(this!=&l){
        if(number>l.number)
            delete [] (item + l.number);
        if(number<l.number)
            delete [] item;
        item = new T*[l.number];

    for(int i=0;i<l.number;i++)
        if(l.item[i])item[i] = new T(*l.item[i]);
    }
    return *this;
}//assignment operator

protected:
    int number;
    T** item;

};

Klasa wielomian

Kopiuj
 
template<class T> class polynomial: public list<T> {
public:
    using list<T>::item;
    using list<T>::number;
    polynomial(int n = 0){
        number=n;
        item = n ? new T*[n] :0;
        for(int i=0;i<n;i++)
            item[i]=0;
    }
    polynomial(int n, const T&t){
        number = n;
        item=n?new T*[n]:0;
        
        for(int i=0;i<n;i++)
            item[i]=new T(t);
    }
  int degree() {
        return (number-1);
  }

};
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
PO
  • Rejestracja: dni
  • Ostatnio: dni
1

Masz napisane dokładnie o co chodzi w komunikacie o błędzie. Przy konstruktorze klasy polynomial musisz podać, którego konstruktora użyć dla klasy bazowej. Spróbuj tak:

Kopiuj
template<class T> class polynomial: public list<T> {
public:
    polynomial(int n = 0):list<T>(n) {}
    polynomial(int n, const T&t):list<T>(n,t) {}
  int degree() {
        return (number-1);
  }
};

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.