2011-07-26 19 views
1

私はPythonに慣れていて、C++を学ぶのに苦労しています。私は「移動」機能を持つクラスを持っているときPythonでは、私は単にリストにそのメンバーを追加し、このようなリストを反復処理することができます。C++クラスの複数のメンバーを同時に扱う方法は?

for i in list: 
    i.move(n) 

さて、どのように対応する事がCで便利に行われ++ ?

+1

は、あなたのクラスをふり「私はクラス...を持っているとき、私は単にリストにそのメンバーを追加することができますが、」構造体Sは、{int型 'です;ダブルb; }; S obj; 'あなたの例では、' list'は 'obj.a'と' obj.b'、または 'obj'自体を含んでいますか?提供された回答は後のオプションについて議論しますが、あなたの言葉は前者を示唆しています。これはかなり困難です。 C++では、任意のクラスのメンバを検査するために必要なリフレクションはサポートされていません。 –

答えて

6

ポインタやオブジェクトへの参照を使用してC++で同じことができます。

クラスがMyClassある場合は、宣言することができます:

std::vector<MyClass*> list; 

を、リストにあなたのオブジェクトを追加します。

list.push_back(&objectOfMyClass); //-- for all of your objects 

し、最終的に:

std::vector<MyClass*>::iterator itr; 
for (itr = list.begin(); itr != list.end(); ++itr) { 
    (*itr)->myMethod(...); 
} 

私が使用しているstd::vector簡単にオブジェクトを割り当てることができます(自動的に成長します)。イテレータはあなたに知られているはずですが、好きな場合はプレーンな配列を使うだけで同じことができます。

+0

ベクトルがポインターではないオブジェクト(一般的には)を含むように設計されているため、ベクトルでポインターを使用する理由については言及する価値があります。 –

+0

これは説得力がありますが、最初の行では私に間違いがあります。 'template class std :: allocatorのテンプレート引数は、ローカルタイプ' main():: MyClass 'を使用します。 2番目の行は、 "list"のメンバ 'push_back'のリクエストです。これは、非クラス型 'int' "です。私はそれが単に私の日ではないと思うので、私は今あなたを気にしなくなります。 – xcel

+0

コンパイルしようとしているコードを投稿しますか?あなたが 'main()'の中に 'MyClass'を定義しようとしたようです。(これを読んでください:http://stackoverflow.com/questions/876048/why-can-i-define-structures-and- c-function-in-c)を使用します。それを外側に定義して、すべてがうまくいくはずです...私がコードに対して行った編集にも注意してください... – sergio

0
//create a vector of int's (basically a container, like an array) 
vector<int> v; 
//insert item into vector  
v.push_back(12); 

//create an iterator that points to the first item in the vector  
vector<int>::iterator iter = v.begin(); 


// move through the vector from begin() to end(), printing each item to console.  
for (; iter != v.end(); iter++) 
{ 
    std::cout << *iter; 
} 
+0

したがって、クラスメンバ自身ではなく、整数は何を表し、どのようにすべてのクラスメンバの関数(または値)を参照するのですか? – xcel

+0

デモ用に、ベクトルに格納されている要素の型として 'int'が使用されています。いくつかの基本的な要件(基本的には値のように動作し、そのようにコピーできるタイプ)を満たすものはすべて格納できますが、ベクター内のすべてが同じタイプである必要があります。 'iter' *は、要素へのポインタのように動作します。 'iter-> foo'のようなメンバ関数にアクセスすることができます。 –

0

+0

なぜではない: 'Iterator-> move(n);' –

1

は、あなたはおそらくこれがあなたの容器の中に異なる型のオブジェクトを持っていることを意味する仮想関数を使用したいので、ブーストのforeach

を使用して、構文のようなあなたのpythonを得ることができます試してみてください。これはポインタのコンテナが必要なことを意味します。boost :: ptr_vector(ptr_listは同じように動作します)。

その後、我々はこのような単純なアプリケーションを得ることができます。

#include <boost/foreach.hpp> 
#include <boost/ptr_container/ptr_vector.hpp> 

#define foreach BOOST_FOREACH 

class MyBase {public: virtual ~MyBase() {} virtual void move(int x) = 0;} 

int main() 
{ 
    boost::ptr_vector<MyBase> data /*= fillData()*/; 

    foreach(MyBase& i, data) 
    { 
     i.move(4); 
    } 
}