2010-11-24 22 views
1

良い一日の人々 私は愚かなC++の問題に固執しています。std :: vectorの問題

のは、私はイテレータクラスへのポインタを含むベクトルの値を通過IT1と呼ばれている、我々はCを呼び出します言ってみましょう:

std::vector<C*>::iterator it1; 

しかし、Cだけではありません:それは多くのサブクラスを持っていますこれらの実装は異なるかもしれませんが、私はit1で探しているのと同じ属性とメソッドを共有しています。イテレータがクラスCだけでなくその子要素の要素(またはより良い、ポインタ)を反復したいと思ったら、私はどうしたらよいでしょうか?

私はテンプレートを使って何かを考えていましたが、テンプレートをCとそのサブクラスに限定する方法がわからないので、反復が安全ではないでしょう。助言がありますか?

編集:はい、私は再帰的なデータ構造について話していました。

Edit2:結局のところ、イテレータの問題ではないようです。私のコードはうまくいきました。私はその変更を実装しようとしていたので質問しました。私は何をすべきか分かりませんでした。申し訳ありませんが、それが不明な場合。

+0

あなたは再帰的またはフラットなデータ構造について話していますか?あなたは、区別を混乱させる用語を使用します。 – robert

+1

すでにCとその子に限定されています。 –

+0

コードが機能するはずです。あなたはコードフラグメントを表示できませんか? –

答えて

2

は、私はあなたが何を意味するか知っていると思います。 Cはあなたの基底クラスであり、AとBはCから派生しています。しかし、Cには存在しないAやBという関数があります。この場合、私は*itからA*またはB*へのダウンキャストが必要です。例外的なケースでこれを行う必要がある場合はOKを、それ以外の場合は再設計する必要があります。

+0

はい、正確です。私は一度だけそれをしなければならないが、それは悪いデザインだ、あなたは正しい。 – Hector

1

ベクトル< C *> :: iteratorはベクトル< C *>でのみ動作します。誰かが他のイテレータを作ることができますが、あなたの構造体では動作しません。そして、多型に基づいて、ベクトルこれは正常に動作しますC.

2

の任意のサブクラスにすることができ、「ポイント」< C *> ::イテレータ:

class C 
{ 
    public: 
     virtual void WhoAmI() { std::cout << "C\n"; } 
}; 
class D: public C 
{ 
    public: 
     virtual void WhoAmI() { std::cout << "D\n"; } 
}; 

int main() 
{ 
    C     cObject; 
    D     dObject; 
    std::vector<C*> data; 
    data.push_back(&cObject); 
    data.push_back(&dObject); 

    std::vector<C*>::iterator it1; 

    for(it1 = data.begin(); it1 != data.end(); ++it1) 
    { 
     (*it1)->WhoAmI(); 
    } 
} 
1

クラスCのパブリックインターフェイスで定義された(仮想)メソッドだけを呼び出している限り、継承と動的バインディングにはあなたのためのすべての世話。 )(ただし、動的バインディングはのdoItのどのバージョンを決定する場に出た - あなたが持っているのであれば、例えば、イテレータは各ポインタにアクセス

class C { 
public: 
    virtual oid doit() { std::cout << "I am a C object" << std::endl; } 
}; 

class D : public C { 
public: 
    void doit() { std::cout << "I am a D object" << std::endl; } 
}; 

int main() 
{ 
    C c; 
    D d; 
    std::vector<C*> cs; 
    cs.push_back(&c); 
    cs.push_back(&d); 

    vector<C*>::iterator ci; 
    for (ci = cs.begin(); ci != cs.end(); ci++) { 
     (*ci)->doit(); 
    } 
} 

のために、その後、ポインタを介してアクセスする各オブジェクト上のdoIt()関数を呼び出します関数は、オブジェクトの実行時の型に応じて呼び出されます。

関連する問題