[c++]代理对象模式

代理对象

#include <iostream>
#include <vector>
using namespace std;
class Vehicle {
 public:
  Vehicle() {}
  virtual string getName() = 0;
};

class Car : public Vehicle {
 public:
  Car() {
    name = "car";
  }
  virtual string getName() {
    return name; }
  ~Car() {
    cout << "delete" << endl;
  }
private:
  string name;
};

class Bike : public Vehicle {
 public:
  Bike() {}
  virtual string getName() { return "bike"; }
private:
  string name;
};
void wrong_code(vector<Vehicle *> &parkinglot) {
  Car c;
  cout << &c << endl;
  parkinglot[0] = &c;  //将c插入到parkinglot内
  cout << &(*parkinglot[0]) << endl;
}
int main() {
  vector<Vehicle *> parkinglot(1);
  wrong_code(parkinglot);
  cout << parkinglot[0]->getName() << endl;  // Oops!!parkinglot内存的地址指向了一块被销毁的内存
  cout << &(*parkinglot[0]) << endl;
  return 0;
}

0x7fff5fbff6d8
0x7fff5fbff6d8
delete


0x7fff5fbff6d8
0x7fff5fbff6d8
delete
乱码。。。。
0x7fff5fbff6d8

在这种情况下会出现因为临时对象在生命周期结束之后,对象上的内存被释放,所以访问它的数据就会出现不可预计的结果。

在这种大前提下,代理类就顺势而生了.

顾名思义,代理类就是指某个基类以及其子类的代理,其功能是使之能在容器中也表现出多态性.而没有动态内存管理的烦恼.

现在定义Vehicle以及子类的代理类VehicleSurrogate.

#include <iostream>
#include <vector>
using namespace std;

class Vehicle {
 public:
  Vehicle() {}
  virtual string getName() = 0;
  virtual Vehicle *copy() const = 0;
  virtual ~Vehicle() {}  //虚析构函数是为了支持多态.但是本例中并不需要.
 private:
};

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

 private:
  string name;
};

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

 private:
  string name;
};

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) {
    if (this !=
        &vs)  //在删除p之前一定得记得判断vs和this是不是同一个,否则会有问题
    {
      delete p;
      p = vs.p->copy();
    }
    return *this;
  }
  string getName() { return p->getName(); }
  ~VehicleSurrogate() { delete p; }

 private:
  Vehicle *p;
};
void right_code(vector<VehicleSurrogate> &parkinglot) {
  Car c;
  parkinglot.push_back(c);
}
int main() {
  vector<VehicleSurrogate> parkinglot;
  right_code(parkinglot);
  cout << parkinglot[0].getName() << endl;
  return 0;
}
car

所以,这种代理对象的模式实际上就是对对象的封装,同时处理他们对他们进行资源管理,从而防止指针对象指向未被析构的对象地址,已经内存泄露的问题。

示例来自

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值