246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 98
Текст из файла (страница 98)
Однако эту строку нельзя удалить, потому что при создании массивацелочисленные значения не будут автоматически инициализироваться нулевыми значениями.Выход состоит в том, чтобы объявить в шаблоне дополнительный специализированныйконструктордлясозданиямассиваобъектовAnimal.Этаидеяреализованавлистинге19.6путемявноговыполненияклассаAnimal.Листинг19.6.Специальныереализациишаблона1:#include<iostream.h>2:3:constintDefaultSize=3;4:5://Обычныйкласс,изобъектовкоторогосоздаетсямассив6:classAnimal7:{8:public:9://конструкторы10:Animal(int);11:Animal();12:~Animal();13:14://методыдоступа15:intGetWeight()const{returnitsWeight;}16:voidSetWeight(inttheWeight){itsWeight=theWeight;}17:18://дружественныеоператоры19:friendostream&operator<<(ostream&,constAnimal&);20:21:private:22:intitsWeight;23:};24:25://операторвыводаобьектовтипаAnimal26:ostream&operator<<27:(ostream&theStream,constAnimal&theAnimal)28:{29:theStream<<theAnimal.GetWeight();30:returntheStream;31:}32:33:Animal::Animal(intweight):34:itsWeight(weight)35:{36:cout<<"animal(int)";37:}38:39:Animal::Animal():40:itsWeight(0)41:{42:cout<<"animal()";43:}44:45:Animal::~Animal()46:{47:cout<<"Destroyedananimal...";48:}49:50:template<classT>//обьявляемшаблонипараметр51:classArray//параметризованныйкласс52:{53:public:54:Array(intitsSize=DefaultSize);55:Array(constArray&rhs);56:~Array(){delete[]pType;}57:58://операторы59:Array&operator=(constArray&);60:T&operator[](intoffSet){returnpType[offSet];}61:constT&operator[](intoffSet)const62:{returnpType[offSet];}62:63://методыдоступа64:intGetSize()const{returnitsSize;}65:66://функция-друг67:friendostream&operator<<(ostream&,constArray<T>&);68:69:private:70:T*pType;71:intitsSize;72:};73:74:template<classT>75:Array<T>::Array(intsize=DefaultSize):76:itsSize(size)77:{78:pType=newT[size];79:for(inti=0;i<size;i++)80:pType[i]=(T)0;81:}82:83:template<classT>84:Array<T>&Array<T>::operator=(constArray&rhs)85:{86:if(this==&rhs)87:return*this;88:delete[]pType;89:itsSize=rhs.GetSize();90:pType=newT[itsSize];91:for(inti=0;i<itsSize;i++)92:pType[i]=rhs[i];93:return*this;94:}95:template<classT>96:Array<T>::Array(constArray&rhs)97:{98:itsSize=rhs.GetSize();99:pType=newT[itsSize];100:for(inti=0;i<itsSize;i++)101:pType[i]=rhs[i];102:}103:104:105:template<olassT>106:ostream&operator<<(ostream&output,constArray<T>&theArray)107:{108:for(inti=0;i<theArray.GetSize();i++)109;output<<"["<<i<<"]"<<theArray[i]<<endl;110:returnoutput;111:}112:113:114:Array<Animal>::Array(intAnimalArraySize):115:itsSize(AnimalArraySize)116:{117:pType=newAnimal[AnimalArraySize];118:}119:120:121:voidIntFillFunction(Array<int>&theArray);122:voidAnimalFillFunction(Array<Animal>&theArray);123:124:intmain()125:{126:Array<int>intArray;127:Array<Animal>animalArray;128:IntFillFunction(intArray);129:AnimalFillFunction(animalArray);130:cout<<"intArray...\n"<<intArray;131:cout<<"\nanimaiArray...\n"<<animalArray<<endl;132:return0;133:}134:135:voidIntFillFunction(Array<int>&theArray)136:{137:boolStop=false;138:intoffset,value;139:while(!Stop)140:{141:cout<<"Enteranoffset(0-9)andavalue,";142:cout<<"(-1tostop):";143:cin>>offset>>value;144:if(offset<0)145:break;146:if(offset>9)147:{148:cout<<"***Pleaseusevaluesbetween0and9.***\n";149:continue;150:}151:theArray[offset]=value;152:}153:}154:155:156:voidAnimalFillFunction(Array<Animal>&theArr,157:{158:Animal*pAnimal;159:for(inti=0;i<theArray.GetSize();i++)160:{161:pAnimal=newAnimal(i*10);162:theArray[i]=*pAnimal;163:deletepAnimal;164:}165:}Примечание:Дляоблегченияанализавприведенныенижерезультатыработыпрограммыдобавленыномерастрок,новдействительностиониневыводятся.Результат:1:animal()animal()animal()Enteranoffset(0-9)andavalue.(-1tostop):002:Enteranoffset(0-9)andavalue.(-1tostop):113:Enteranoffset(0-9)andavalue.(-1tostop):224:Enteranoffset(0-9)andavalue.(-1tostop):335:Enteranoffset(0-9)andavalue.(-1tostop):-1-16: animal(int) Destroyed an animal...animal(int) Destroyed an animal...animal(int) Destroyed<b>Текст обрезан, так как является слишком большим</b>.