【问题标题】:Using shared_ptr for different types对不同类型使用 shared_ptr
【发布时间】: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()吗?
  • 即使Enemy1Enemy2 继承自Enemy,您也不能隐式向下转换为一个特定的派生类。将指针从派生类向上转换到基类是安全的,但反之亦然。如果确实需要将基类转换为派生类,通常需要dynamic_caststd::dynamic_pointer_cast
  • 只有在 Enemy 继承自 Enemy1 和 Enemy2 类时才有效

标签: c++ shared-ptr


【解决方案1】:

您正在使用new Enemy() 初始化enemy1enemy2。这仅在Enemy 派生自Enemy1Enemy2 时才有效。我怀疑是这种情况,因此会出现错误。

我相信您实际上应该使用适当类型 Enemy1Enemy2 的实例来初始化它们。您还应该考虑使用std::make_shared

auto enemy1 = std::make_shared<Enemy1>();
auto enemy2 = std::make_shared<Enemy2>();

【讨论】:

  • 你一定是在开玩笑吧!一次又一次,当我应该知道的时候,我犯了这些愚蠢的错误! :(谢谢
【解决方案2】:

看起来指向 Enemy2 的指针不是指向 Enemy 的指针,这很可能意味着 Enemy2 不是从 Enemy 继承的。不过,一切看起来都适合 Enemy1。

【讨论】:

    猜你喜欢
    • 2016-12-29
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多