假设我们有一个名为Vehicle的抽象类。一堆类将继承自Vehicle,例如Boat,Car,Truck等。
我想创建一个函数,它给我一个指向车辆的指针给定我传入的某些参数。我不需要访问底层的Vehicle。到目前为止我有这样的事情:
boost::shared_ptr<Vehicle> create_vehicle(Environment e, Cost c) {
if (e.is_water()) {
boost::shared_ptr<Boat> boat(new Boat());
boat->set_location("USA");
boat->set_environment(e);
...
return boat; // How should I return the shared pointer here?
// I get an error for doing this
// "Vehicle is an inaccessible base of boat"
} else if (e.is_land()) {
...
}
}
当函数的返回值是shared_ptr时,如何返回派生的shared_ptr?铸造是必要的还是没有铸造的方法?我想我也可以按值返回派生类,但是当我退回时我不想再制作车辆的副本。
答案 0 :(得分:5)
从您的错误消息出现,您在Vehicle
和Boat
之间使用了私有或受保护的继承,而非公开。
答案 1 :(得分:1)
您需要使用static_pointer_cast
- 它与shared_pointers的static_cast相当。看http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/shared_ptr.htm#functions
答案 2 :(得分:0)
您可以创建一个到车辆的shared_ptr并使用它
boost::shared_ptr<Vehicle> create_vehicle(Environment e, Cost c)
{
boost::shared_ptr<Vehicle> vehicle;
if (e.is_water()) {
Boat *boat = new Boat();
boat->set_location("USA");
boat->set_environment(e);
vehicle.reset(boat); // Assign the pointer to the result
} else if (e.is_land()) {
...
}
return vehicle;
}