タイプのプロキシクラス(c++)

2184 ワード

タイプのプロキシクラスは、オブジェクトの事前割り当てとメモリの動的割り当てと回収を管理するための方法です.
一般的なタイプは関係を継承します.コードは次のとおりです.
class Vehicle
{
public:
    Vehicle(){}
    virtual string getName()= 0;
};

class Car : public Vehicle
{
public:
   Car(){}
   virtual string getName(){}
};

class Bike : public <span style="font-family:   ;">Vehicle</span>
{
public:
    Bike(){}
    virtual string getName(){}
};


以上の継承方式では,Vehicle配列のような配列を予め割り当てることが困難であるという欠点がある.
メモリは手動で解放する必要があります.
 
エージェントクラスとは、あるベースクラスおよびそのサブクラスのエージェントを指し、コンテナにおいても多態性を示すように機能する.メモリを自動的に管理できる.
VehicleのエージェントクラスVehicleSurrogate.コードは次のとおりです.
class Vehicle
{
public:
	Vehicle(){} 
	virtual string getName() = 0;
	virtual Vehicle* copy() const = 0;
	virtual ~Vehicle(){} //            . 
}; 

class Car :public Vehicle
{
public:
    Car(){}
    virtual string getName() {return "car";} 
    virtual Vehicle* copy() const {return new Car;}
    virtual ~Car(){}
};

class Bike : public Vehicle
{
public:
    Bike(){}
    virtual string getName(){return "bike";}
    virtual Vehicle* copy()const {return new Bike;}
    virtual ~Bike(){}
};

class VehicleSurrogate
{
public:
    VehicleSurrogate():p(0){}
    VehicleSurrogate(const Vehicle& v):p(v.copy()){}
    VehicleSurrogate(const  VehicleSurrogate &vs):p(vs.p ? vs.p->copy() : 0){}
    VehicleSurrogate & operator=(const VehicleSurrogate &vs);
    string getName(){return p->getName();}
    ~VehicleSurrogate(){if(p)delete p;}
private:
    Vehicle *p;
};

VehicleSurrogate & VehicleSurrogate::operator=(const VehicleSurrogate&vs)
{
   if (this != &vs) //   p         vs this      ,      
   {
      delete p;
      p = vs.p->copy();
   }
   return *this;
}

int main()
{
	Car c;
	Bike b;
	
	VehicleSurrogate vs1(c);
	std::cout << vs1.getName() << std::endl;
	VehicleSurrogate vs2(b);
	std::cout << vs2.getName() << std::endl;
	return 0;
}

実行結果:
car
bike.
メリット:
VehicleSurrogate配列のような予め割り当てられた容器の定義を容易にする.
メモリを手動で動的に管理する手間が省けます.
欠点:
Vehicleはコピーインタフェースを追加しました.メモリ・レプリケーションの負荷が増加します.