<derived> 从函数返回时如何从shared_ptr转换为shared_ptr<base>?
How do you convert from shared_ptr<derived> to shared_ptr<base> when returning from a function?
假设我们有一个抽象类Vehicle。一堆类将继承自Vehicle,如Boat, Car, Truck等。
我想创建一个函数,该函数返回给我一个指向给定参数的车辆的指针,我传入。我不需要访问底层车辆。到目前为止,我有这样的东西:
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?铸造是必要的还是有办法不铸造?我想我也可以按值返回派生类,但我不想在返回时制作另一个车辆副本。
从您的错误消息显示您在Vehicle
和Boat
之间使用了私有或受保护的继承,而不是公共继承。
您需要使用static_pointer_cast
-它在某种程度上相当于shared_pointer的static_cast。看看http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/shared_ptr.htm#functions
你可以为Vehicle创建一个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;
}
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理