std::unipue_ptrとstd::listその他の華麗な連携
VS2010すげえ! っていうか、C++0xが素敵っ!
下のようなのが書ける。
#include <list> #include <memory> #include <iostream> #include <utility> #include <algorithm> using namespace std; class Unit{ public: int pos_x,pos_y; Unit(int x, int y) : pos_x(x),pos_y(y){} virtual void Draw() = 0; }; class A : public Unit{ public: A(int x, int y) : Unit(x,y){} virtual void Draw() { cout << "A!:" << pos_x << ":" << pos_y << endl; } }; class B : public Unit{ public: B(int x, int y) : Unit(x,y){} virtual void Draw() { cout << "B!:" << pos_x << ":" << pos_y << endl; } }; int main(){ list< unique_ptr<Unit> > unit_list; list< unique_ptr<Unit> >::iterator it; // 普通の生成 unique_ptr<Unit> a(new A(3,3)); // OK // 普通の生成 unique_ptr<Unit> b = unique_ptr<Unit>(new B(8,8)); // OK // =演算子でのコピー unique_ptr<Unit> a2 = a; // unique_ptrはコピーできないのでエラー // コピーコンストラクタでのコピー unique_ptr<Unit> a2(a); // unique_ptrはコピーできないのでエラー // std::move.コピーでなく移動をさせる。 unique_ptr<Unit> a2 = move(a); // 移動なのでOK。aは空になり、インスタンスはa2に移動する。 // std::swap.値の交換を行う。 swap(a,b);// 交換もOK。中身が交換される。 // デフォで連携してるので、勝手に所有権の移動が行われてunique_ptrが格納できる。 unit_list.push_back( unique_ptr<Unit>(new A(1,2) ) ); unit_list.push_back( unique_ptr<Unit>(new B(-4,3) ) ); unit_list.push_back( unique_ptr<Unit>(new A(5,8) ) ); for(it = unit_list.begin(); it != unit_list.end(); it++) { (*it)->Draw(); } return 0; }
もう生ポインタとか書かなくて良くね?