2014-01-16 15 views
8

私は書いたいくつかのアルゴリズムで、本質的に符号なし整数のベクトルのベクトルであるtableauxというオブジェクトのクラスを作成しようとしています(行列以外の行列は異なる長さです)。主な問題は、これらのオブジェクトのイテレータをベクタークラスから継承したいと思っていることです。STLクラスからイテレータを「継承する」方法は?

私は、std::vector<std::vector<unsigned int> >を公に継承するのはかなり簡単ですが、仮想デストラクタなどを持たないSTLコンテナの理由でこれが悪いとのコンセンサスがあります。だから私は作曲によって "継承"しようと決心しました。

#include <vector> 
#include <iostream> 

class tableau { 
    private: 
    std::vector<std::vector<unsigned int> > rep; 
    public: 
    using std::vector<std::vector<unsigned int> >::iterator; 
    void push_back(std::vector<unsigned int> const& new_row) { 
     rep.push_back(new_row); 
    } 
}; 

int main() { 
    tableau t1; 
    std::vector<unsigned int> row1(10); 
    std::vector<unsigned int> row2(8); 

    t1.push_back(row1); 
    t1.push_back(row2); 

    tableau::iterator it = t1.begin(); 
    for (; it != t1.end(); ++it) { 
    //display rows of tableau 
    } 
    return 0; 
} 

しかし、その後、G ++私にエラーを与える:ここで私が達成しようとしているものの多少、最小限の例である型「std::vector<std::vector<unsigned int> >は、」タイプ「タブロー」の基本型ではありません。私はちょうどC++を学び始めているので、何か愚かなことをしたら穏やかにしてください。私が書いた実際のコードをもっと欲しければ、教えてください。

+3

一般的に、これは非常に良いテストケースです。よくやった。 :) –

答えて

10

最初の問題は、usingは任意の無関係のタイプからタイプを盗むことができないことです(これにはtypedefを使用できます)。また、begin()またはend()のメンバーはありません。

これらの問題を解決するには、次のような結果になります。

#include <vector> 
#include <iostream> 

class tableau { 
    private: 
    std::vector<std::vector<unsigned int> > rep; 
    public: 
    typedef std::vector<std::vector<unsigned int> >::iterator iterator; 
    void push_back(std::vector<unsigned int> const& new_row) { 
     rep.push_back(new_row); 
    } 
    iterator begin() { return rep.begin(); } 
    iterator end() { return rep.end(); } 
}; 

int main() { 
    tableau t1; 
    std::vector<unsigned int> row1(10); 
    std::vector<unsigned int> row2(8); 

    t1.push_back(row1); 
    t1.push_back(row2); 

    tableau::iterator it = t1.begin(); 
    for (; it != t1.end(); ++it) { 
    //display rows of tableau 
    } 
    return 0; 
} 

はしかし、あなたのアプローチは、あなたが呼び出したいすべての単一の機能をラップする必要があるとしていることを意味します。

私があなたであれば、私は相続財産に固執します:あなたが言及したアドバイスは正しいが、それは継承が不可能ではないということです。 tableauをポインタベースのポリゴンを使って決して使用したくないので、誰もこれを試してはいけないことを単に文書化すれば、あなたはうまくいくでしょう。

(あなたは「組成物」を利用する場合には、それが「構成」と呼ばれています。あなたはベクトルを「作曲」する方法を求めている。)

+0

おかげさまで、作曲のコンセプトは今、もっと感謝しています。このケースでは、私はちょうど継承に固執すると思います。 –

+0

@ジョセフ:私はそれが賢明だと思います。 –

+0

+1コンテナの継承は、一部の人々がそれを作ろうとするほど悪くありません。 – jrok

関連する問題