Сколько секунд ты сэкономил, не набирая пробелы в коде, и сколько потерял я, пытаясь в нём разобраться…
Ошибки: 1) Сигнатура определения конструктора класса Array не соответствовала его объявлению (отсутствовал const). 2) Попытка обращаться к объектам типа Array, как a[index], не определив оператор [] или оператор преобразования к T*. 3) В функции zapolnenieAnimal производится попытка создания объекта типа Animal с одним параметром типа int, в то время как у этого класса есть конструктор без параметров и конструктор с двумя параметрами типа int.
Код с исправлениями:
| Код | #include <iostream> #include <cassert>
class Animal { public: Animal():mAge(0),mWeigh(0){} Animal(int Age, int Weigh): mAge(Age), mWeigh(Weigh){} ~Animal(){} int GetAge()const {return mAge;} void SetAge(int Age){mAge=Age;} int GetWeigh()const {return mWeigh;} void SetWeigh(int Weigh){mWeigh=Weigh;} friend std::ostream& operator<< (std::ostream&, Animal&); private: int mAge; int mWeigh; };
std::ostream& operator<<(std::ostream& Astream, Animal& Ani) { Astream << Ani.GetAge(); Astream << Ani.GetWeigh(); std::cout<<"Animal<<"; return Astream; }
template <class T> class Array { public: Array(int Size=5); Array(const Array&); ~Array(){delete [] pTipe; } Array& operator=( Array&); int GetSize(){return mSize;} void SetSize(int Size){mSize=Size;} T &operator [](int index); const T &operator [](int index) const; template <class T> friend std::ostream& operator<<(std::ostream&, Array<T>&); private: int mSize; T *pTipe; };
template <class T> Array<T>::Array(int Size) : mSize(Size) { pTipe=new T[Size]; for(int i=0;i<Size;i++) pTipe[i]=0; }
template <class T> Array<T>::Array(const Array& rhs) { mSize = rhs.GetSize(); pTipe = new T[mSize]; for(int i=0;i<rhs.GetSize();i++) pTipe[i]=rhs[i]; }
template <class T> Array<T>& Array<T>::operator=(Array<T>& rhs) { if(this==&rhs) return *this; delete [] pTipe; mSize = rhs.GetSize(); pTipe= new T[Size]; for(int i=0;i<mSize;i++) pTipe[i]=rhs[i]; return *this; }
template <class T> T& Array<T>::operator [](int index) { assert(index >= 0 && index < mSize); return pTipe[index]; }
template <class T> const T& Array<T>::operator [](int index) const { assert(index >= 0 && index < mSize); return pTipe[index]; }
template <class T> std::ostream& operator<< (std::ostream& ArStream, Array<T>& Arr){ for(int i=0;i<Arr.GetSize();i++) ArStream << Arr[i]; std::cout<<"template <<"; return ArStream; }
void zapolnenieInt(Array<int>& Arr){ for(int i=0;i<5;i++) Arr[i]=i*5; }
void zapolnenieAnimal(Array<Animal>& Arr) { Animal *pAni; for(int i = 0; i < Arr.GetSize(); i++){ pAni = new Animal(); // wtf?! Arr[i] =* pAni; delete pAni; } }
int main(){ Animal a; Array<int> b; std::cout<<a<<std::endl; zapolnenieInt(b); std::cout<<b; return 0; } |
|