如何使这项工作?
我想使用多种类型的向量(研究、添加、删除)进行库存管理(药水、武器等。所有这些都派生自虚拟类 Item)。
我在这里简化了问题:我有一个包含项目(基类)和武器(派生类)的向量。对于内存管理问题,我更喜欢使用 unique_ptr 但没有办法返回或正确使用它。
下面的例子:
// UniquePointerAndPolymorphism.cpp : Ce fichier contient la fonction 'main'. L'exécution du programme commence et se termine à cet endroit.
//
#include <iostream>
#include <vector>
class Item
{
protected:
std::string name_;
public:
Item(std::string name) :name_(name) {};
virtual std::string getName() { return "b_" + name_; };
};
class Weapon : public Item
{
public:
Weapon(std::string name) : Item(name) {};
std::string getName() override { return "d_" + name_; };
};
std::vector<std::unique_ptr<Item>> elements;
std::unique_ptr<Weapon> getAnElement_uniquePointer(int i)
{
/*
*
* How to return unique pointer from the vector ?????
*
*/
return std::make_unique<Weapon>("returned");
}
Weapon* getAnElement_rawPointer(int i)
{
if (auto oneElement = dynamic_cast<Weapon*>(elements[i].get()))
{
return oneElement;
}
else
{
return nullptr;
}
}
int main()
{
elements.push_back(std::make_unique<Weapon>("1"));
elements.push_back(std::make_unique<Item>("2"));
elements.push_back(std::make_unique<Weapon>("3"));
Weapon* rptElement = getAnElement_rawPointer(2);
std::cout << rptElement->getName() << std::endl;
std::unique_ptr<Weapon> uptElement = std::move(getAnElement_uniquePointer(0));
std::cout << uptElement->getName() << std::endl;
}
所以我有几个问题:
- 即使看起来不是问题,多态性是否与智能指针兼容?
- 返回原始指针是唯一的解决方案吗?
- 我是否必须使用 shared_pointer 在向量和程序的另一部分中使用它?
- 有没有办法返回参考?
谢谢。塞巴斯蒂安