2017-06-08 17 views
0

私は問題がある、私はベースオブジェクトのベクトルへの一意のポインタを作成したい。 Base(​​)のこのベクターサブクラスに保存したいが、Baseクラスが仮想であるため、初期化に問題がある。ベクトルとポリモーフィズムへのユニークなポインタ

std::unique_ptr<std::vector<Base>> baseVector = std::make_unique<std::vector<Base>>(); 
SubClass newObject(); 
baseVector->push_back(newObject); 
+3

ベクトルへのポインタは必要ありませんが、*基本クラス*へのポインタです。すべての説明があるので、[良い初心者の本を見つける](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を試してください。 –

+0

オブジェクトを格納するには、Baseへのポインタを使用する必要があります。これを参照してくださいhttps://stackoverflow.com/questions/2394581/pure-virtual-class-and-collections-vector – 0x0001

+5

代わりに 'std :: vector >'(あるいは 'std :: vector 'ベクトルに所有権がない場合)。 – Jarod42

答えて

1

ショートバージョン経由の要素を追加します。あなたは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 

は、この問題に関係のない(とやや疑問)です。

+0

ありがとうございました:) –

2

塩基のベクターは多型をサポートしていません。このためには、参照やポインタまたはより良いスマートポインタが必要になります。

auto baseVector = std::make_unique<std::vector<Base*>>(); 
auto baseVector = std::make_unique<std::vector<std::unique_ptr<Base>>>(); 

baseVector.push_back(std::make_unique<SubClass>()); 
関連する問題