2016-10-23 28 views
2

戦略パターンを実装したいとします。インターフェイスBaseと、2つの派生クラスABがあります。 Doerクラスのインスタンスは、ABのメソッドdo()の中から選択できます。問題は、コードをどのようにして完成させるかです。std :: make_unique関数とインターフェイスクラスを使用するには?

class Base { 
    virtual void do() const = 0; 
}; 

class A: public Base { 
    void do() const override {}; 
}; 

class B: public Base { 
    void do() const override {}; 
} 

class Doer { 
    public: 
    Doer(std::unique_ptr<Base> b_ptr) : ptr(b_ptr) {} 
    void do() const { ptr->do(); } 
    private: 
    std::unique_ptr<Base> ptr; 
} 

int main() { 
    Doer doer(std::unique_ptr<Base>()); 
    doer.do(); 
    return 0; 
} 

答えて

3

コードには3つの大きな問題があります。

1)doは、この言語のキーワードです。あなたは空のunique_ptrDoerに年代を渡す)

Doer(std::unique_ptr<Base> b_ptr) : ptr(std::move(b_ptr)) {} 

3:あなたはそこから移動する必要があるので、あなたは、値によってb_ptrを取る)

2(関数名などの)識別子として使用することはできませんコンストラクタです。nullptrを渡すのと同じです。また、基本クラスのインスタンスを作成しようとします。 Baseは純粋な仮想クラスなので不可能です。導出タイプのmake_uniqueを使用してください。

Doer doer(std::make_unique<A>()); 
4
Doer doer(std::make_unique<A>()); // or std::make_unique<B>() 

上記かなりそれです。 std::unique_ptrは、それが保持する生ポインタと同じ強制を実装するのが非常に難しいです。

関連する問題