【发布时间】:2014-03-31 01:43:36
【问题描述】:
恐怕我认为我在这里遗漏了一些东西,需要一些帮助。我在网上搜索过(可能不是很好),但没有找到对我有帮助的信息。
我有一个场景,我想创建三个单独的向量,它们都包含不同类型的 shared_ptrs。所以我想要一个包含一个 Enemy 对象的 shared_ptrs 的向量和一个包含一个 Enemy2 对象的 shared_ptrs 的向量。
我之前已经成功使用了 shared_ptrs 的向量,但如果我没记错的话,我只需要存储相同的类型,所以没有任何问题。我目前正在尝试像这样实现它:
// Defining my vectors
std::vector<std::shared_ptr<Enemy1>> enemyVec1;
std::vector<std::shared_ptr<Enemy2>> enemyVec2;
// Creating new enemy objects and putting in to vector
std::shared_ptr<Enemy1> enemy1(new Enemy());
std::shared_ptr<Enemy2> enemy2(new Enemy());
enemyVec1.push_back(enemy1);
enemyVec2.push_back(enemy2);
这是错误信息:
c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory(1705): error C2664: 'std::tr1::_Ptr_base<_Ty>::_Reset0' : cannot convert parameter 1 from 'Enemy *' to 'Enemy2 *'
我对这里可能发生的事情有点熟悉,但我不能 100% 确定。我更不确定如何以“正确”的方式进行编码,因为我看到的许多示例似乎从未涵盖不同类型的 shared_ptrs 的使用。
如果我取出对 Enemy2 类和类的所有引用,并且只将 shared_ptrs 用于一种类型,那么代码就可以正常工作。我以为我知道 shared_ptrs 是如何工作的,但我显然不知道,所以我需要阅读更多关于它们的信息。
但与此同时,有人可以向我解释我在这里做错了什么吗?
谢谢
【问题讨论】:
-
不应该是
new Enemy2()而不是第二个new Enemy()吗? -
即使
Enemy1和Enemy2继承自Enemy,您也不能隐式向下转换为一个特定的派生类。将指针从派生类向上转换到基类是安全的,但反之亦然。如果确实需要将基类转换为派生类,通常需要dynamic_cast或std::dynamic_pointer_cast。 -
只有在 Enemy 继承自 Enemy1 和 Enemy2 类时才有效
标签: c++ shared-ptr