我在创建容器类时遇到了一些问题.
这是我想要的行为:
class AbstractBase
{
public:
AbstractBase() { }
virtual std::string toString()=0;
};
class Derived : public AbstractBase
{
public:
Derived() { }
std::string toString() { return "Just an example " + std::to_string( _value ); }
private:
int _value;
};
void Container::print()
{
for( auto i : bunch_of_different_derived_objects_that_i_own )
std::cout << i.toString() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
通过仅保留指向AbstractBase类的指针来创建"拥有"一堆不同派生对象的容器类的最佳方法是什么?
是否可以在不知道其定义的情况下使容器类拥有不同的派生对象?
运用
std::vector<std::shared_ptr<AbstractBase>>
Run Code Online (Sandbox Code Playgroud)
造成了奇怪的行为
std::vector<std::unique_ptr<AbstractBase>>
Run Code Online (Sandbox Code Playgroud)
是不可能迭代的.
有可能实现我想要的吗?
1.声明虚拟析构函数
class AbstractBase
{
public:
AbstractBase() { }
virtual ~AbstractBase() = default; // this is (defaulted) virtual destructor
virtual std::string toString() = 0;
};
class Derived : public AbstractBase
{
public:
Derived() { }
virtual std::string toString() override { return "Just an example " + std::to_string( _value ); }
private:
int _value;
};
Run Code Online (Sandbox Code Playgroud)
2.将shared_ptr存储在向量中
std::vector<std::shared_ptr<AbstractBase>> v = { std::make_shared<Derived>() };
Run Code Online (Sandbox Code Playgroud)
3.做你的东西而不再关心析构函数.
for (auto i : v)
{
std::cout << i->toString() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)