2016-10-27 6 views
1

、私はC++/OOPに新たなんです。C++私のクラスにSTLコンテナを含めるする適切な方法は何ですか?そもそも

私は私のクラスでのstd ::マップを含めると、私のクラスのユーザーマップのtypedefや能力をどのように提供するかについて疑問に思って。以下の簡単な例のようにする必要がありますか? (私は私がやろうとしているかを示すためにサブセットを示してきました)

それは私が私ものサブセットのためのコンテナを(含まれてきた任意のクラスのためにこれをしなければならない権利を感じていませんマップメソッド)。 これはクラスメンテナンスの問題のようです(たとえば、現在の地図方法は必要ないかもしれませんが、将来必要になるかもしれません)。

p.s.この質問への返答とは別に、以下の例に対する他の修正/フィードバックが評価されます。ここで

#include <map> 
#include <string> 

class Inventory { 

public: 
    typedef std::string key_type; 
    typedef std::string mapped_type; 
    typedef std::map<key_type, mapped_type>::value_type value_type; 

    Inventory() { } 
    Inventory(int lotNum) : lotNum_(lotNum) { } 

    void insert(const value_type& el) { cars_.insert(el); } 

    //  
    // TODO: iterators, erase, etc 
    // 

private: 
    int        lotNum_; 
    std::map<key_type, mapped_type> cars_; 

}; 

int main() { 

    Inventory ourCars(1); 

    ourCars.insert(Inventory::value_type("BMW","ABC123")); 

    return 0; 

} 
+1

なぜさえ呼び出し側に内部を公開しますか? 2つの文字列が必要な場合は、2つの文字列を引数にとり、それらを関数のマップに挿入するだけの理由はありません。 – NathanOliver

+3

クラスのクライアントは、部分的に転送するクラスの代わりに単に 'map'を使うことができます。代わりに 'Inventory'の振る舞いについて考えて、* that *を実装することをお勧めします。 – StoryTeller

+2

この質問はおそらくhttp://codereview.stackexchange.com/に適しています。 – user463035818

答えて

5

は、私はこの問題を考えるだろうかです。あなたのクラスのインターフェイスと実装を別々に考えてみてください。ユーザーはあなたが舞台裏でやっていることを知っている必要はありません - あなたは、そのインタフェースを介して提供し、いくつかの機能を持っている必要があり、それ自体などあなたのクラス使用しているもののコンテナ。あなたのクラスが何をすべきかはわかりませんが、2つの文字列を挿入する関数が必要な場合は、その関数を提供するだけです。それがあなたの出発点です。次に、文字列を地図などに保存することにします。要約すると、マップに入るタイプは、クラスインタフェースによって決定されます。あなたがやっていることは、それを実装する方法を決めてから、インタフェースのマップのタイプを公開することとは反対です。

関連する問題