Andrew Koenig 和 Barbara Moo 堪称C++研究领域的”第一神仙眷侣”,看他们的书非常有条理性。这次要解释的是C++中的另一个常见问题。
找出一种优美的控制内存分配的方法来绑定不同子类对象到容器中。
多么复杂的一句话,莫慌,其实很简单,跟着步伐来看。
1
2
3
4
5
6
|
class
Vehicle {
public
:
virtual
double
weight()
const
= 0;
virtual
void
start() = 0;
// ......
};
|
1
2
3
4
|
class
RoadVehicle :
public
Vehicle {
/* ...... */
};
class
AutoVehicle :
public
RoadVehicle {
/* ...... */
};
class
Aircraft :
public
Vehicle {
/* ...... */
};
class
Helicopter :
public
Aircraft {
/* ...... */
};
|
1
|
Vehicle parking_lot[1000];
|
1
2
|
Helicopter x =
/* ...... */
parking_lot[num_vehicles++] = x;
|
1
|
Vehicle *parking_lot[1000];
// 指针数组
|
1
2
|
Helicopter x =
/* ...... */
parking_lot[num_vehicles++] = &x;
|
1
2
|
Helicopter x =
/* ...... */
parking_lot[num_vehicles++] =
new
Helicopter(x);
|
1
2
3
4
5
6
7
|
class
Vehicle {
public
:
virtual
double
weight()
const
= 0;
virtual
void
start() = 0;
virtual
Vehicle *copy()
const
= 0;
// ......
};
|
1
2
3
4
|
Vehicle *Helicopter::copy()
const
{
return
new
Helicopter(*
this
);
}
|
1
2
|
parking_lot[num_vehicles++] = x.copy();
parking_lot[p] = parking_lot[q]->copy();
|
1
2
3
4
5
6
7
8
9
10
|
class
VechicleProxy {
public
:
VechicleProxy();
VechicleProxy(
const
Vehicle &);
~VechicleProxy();
VechicleProxy(
const
VechicleProxy &);
VechicleProxy &operator=(
const
VechicleProxy &);
private
:
Vehicle *p;
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
VechicleProxy::VechicleProxy(): p(0) { }
VechicleProxy::VechicleProxy(
const
Vehicle &BigStar): p(BigStar.copy()) {}
VechicleProxy::~VechicleProxy() {
delete
p; }
VechicleProxy::VechicleProxy(
const
VechicleProxy &v): p(v.p ? v.p->copy() : 0) {}
VechicleProxy::operator=(
const
VechicleProxy &v)
{
if
(
this
!= &v)
{
delete
p;
p = (v.p ? v.p->copy() : 0);
}
return
*
this
;
}
|
1
2
3
|
VehicleProxy parking_lot[1000];
Helicopter x;
parking_lot[num_vehicles++] = x;
|