我需要做4節課。超類機器人,兩個子類 r1 和 r2 和類線。類robot,r1和r2有一個靜態成員l_obiektow,用于顯示物件的數量和兩個虛擬方法praca,用于顯示物件的型別和clone,用于制作物件的副本。類行用于管理物件 r1 和 r2 的向量。我的方法克隆有問題,我不確定我應該回傳什么型別以及它應該做什么。
#include <vector>
using namespace std;
class robot;
//typedef robot* wsk;
using wsk = robot*;
class robot{
protected:
static int l_ob;
public:
static int l_obiektow(){return l_ob;}
virtual ~robot(){ cout << "~robot()" << endl;}
virtual void praca()const=0;
virtual wsk clone()const=0;
};
class r1 : public robot {
public:
r1(){l_ob ;}
r1(const r1& r){l_ob ;}
void praca()const{
cout<<"r1"<<endl;
}
virtual wsk clone()const{
r1 tmp=r1(*this);
return &tmp;
}
~r1(){cout << "~r1()" << endl; l_ob--;}
};
class r2 : public robot {
public:
r2(){l_ob ;}
r2(const r2& r){l_ob ;}
void praca()const{
cout<<"r2"<<endl;
}
virtual wsk clone()const{
r2 tmp=r2(*this);
return &tmp;
}
~r2(){cout << "~r2()" << endl; l_ob--;}
};
class line{
vector <wsk> ve;
public:
line(){}
line(int r):ve(r){
for(size_t i=0; i<ve.size(); i )
cout << ve[i] << ", " ;
cout << endl;
}
line(const wsk* b, const wsk* e){
size_t roz=e-b;
for(size_t i=0;i<roz;i ){
ve.push_back(b[i]->clone());
}
}
line(const line& arg){
for(size_t i=0;i<arg.ve.size();i ){
ve.push_back(arg.ve[i]->clone());
}
}
line& operator = (const line& a){
if(this!=&a){
ve.clear();
for(size_t i=0;i<a.ve.size();i ){
ve.push_back(a.ve[i]->clone());
}
}
return *this;
}
void add( const wsk& arg){
ve.push_back(arg);
}
void del(int i){
delete ve[i-1];
ve.erase(ve.begin() i-1);
}
void delet(){
delete ve[ve.size()-1];
ve.pop_back();
}
void work(){
for(size_t i=0;i<ve.size();i ){
ve[i]->praca();
}
}
~line(){
for(size_t i=0;i<ve.size();i ){
delete ve[i];
}
ve.clear();
cout<<"~line()"<<endl;
}
};
int robot::l_ob=0;
void numberofobj(){
cout << robot::l_obiektow() << endl;
}
int main()
{
{
{ line l1 ; }
{ line l2(5) ; }
cout << "--==**1**==--" << endl;
line lp1, lp2;
lp1.add(new r1);
lp1.add(new r1);
lp1.add(new r2);
lp1.add(new r2);
lp2=lp1;
{
line lp3;
lp3.add(new r1);
lp3.add(new r2);
lp3.add(new r1);
lp3.add(new r2);
lp3.delet();
cout << "--==**2**==--" << endl;
lp3.work();
lp1 = lp3;
cout << "--==**2a**==--" << endl;
}
cout << "--==**3**==--" << endl;
lp1.work();
cout << "--==**4**==--" << endl;
wsk TabAdrRob[] = {new r2, new r2};
line lp4(TabAdrRob, TabAdrRob 2 );
lp4.work();
cout << "--==**5**==--" << endl;
lp4 = lp2;
lp4.work();
cout << "--==**6**==--" << endl;
line lp6(lp1);
lp6.del(1);
lp6.work();
cout << "--==**7**==--" << endl;
delete TabAdrRob[0];
delete TabAdrRob[1];}
numberofobj();
return 0;
}
uj5u.com熱心網友回復:
這是一個嚴重的錯誤:
virtual wsk clone()const{
r1 tmp=r1(*this);
return &tmp; // returning pointer to a local object
}
您正在回傳指向堆疊上本地物件的指標。后clone()回傳時,tmp將被銷毀。
不要使用原始擁有指標。改用智能指標,例如。unique_ptr.
override在子類中使用也是一個好習慣,因此如果您覆寫錯誤的方法,編譯器可能會發出錯誤。virtual如果不打算派生子類,則不需要子類(這是在 C -11 之前的時代標記虛擬方法的舊方法)。
所以方法變成了:
unique_ptr<robot> clone() const override
{
return make_unique<robot>(new r1(*this));
}
對于機器人串列,您可以使用智能指標向量vector<unique_ptr<robot>>,以便自動銷毀所有物件向量并釋放記憶體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/378727.html
