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ść?
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
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);
}
};