ショートバージョン経由の要素を追加します。あなたはBase
のコレクションに動的にポインタを望んでいません。動的ポインタのコレクションをBase
にしたいとします。
多型コレクションにstd::unique_ptr
をどこに配置するのか誤解されているようです。多型が働くためのポインタである必要があるコレクションではありません。それは内に保持されているオブジェクトです。例えば
:あなたは、コレクション自体はスマートポインタ経由で動的に管理するかどうかを
#include <iostream>
#include <vector>
#include <memory>
struct Base
{
virtual ~Base() {}
virtual void foo() const = 0;
};
class DerivedOne : public Base
{
public:
virtual void foo() const
{
std::cout << "DerivedOne\n";
}
};
class DerivedTwo : public Base
{
public:
virtual void foo() const
{
std::cout << "DerivedTwo\n";
}
};
int main()
{
std::vector< std::unique_ptr<Base> > objs;
objs.emplace_back(std::make_unique<DerivedOne>());
objs.emplace_back(std::make_unique<DerivedTwo>());
// via operator[]
objs[0]->foo();
objs[1]->foo();
// via range-for
for (auto const& p : objs)
p->foo();
// via iterators
for (auto it = objs.begin(); it !=objs.end(); ++it)
(*it)->foo();
}
出力
DerivedOne
DerivedTwo
DerivedOne
DerivedTwo
DerivedOne
DerivedTwo
は、この問題に関係のない(とやや疑問)です。
ベクトルへのポインタは必要ありませんが、*基本クラス*へのポインタです。すべての説明があるので、[良い初心者の本を見つける](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を試してください。 –
オブジェクトを格納するには、Baseへのポインタを使用する必要があります。これを参照してくださいhttps://stackoverflow.com/questions/2394581/pure-virtual-class-and-collections-vector – 0x0001
代わりに 'std :: vector>'(あるいは 'std :: vector 'ベクトルに所有権がない場合)。 –
Jarod42