2011-07-26 19 views
1

我習慣Python,並努力學習一些C++。在Python,當我有一個「移動」功能的一類,我可以簡單地爲其成員添加到列表,並遍歷列表如下:如何同時處理C++類的多個成員?

for i in list: 
    i.move(n) 

現在,如何在C方便地進行相應的事++ ?

+1

「當我有一類...,我可以簡單地爲其成員添加到列表」假裝你的類是'的struct {詮釋一個;雙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'。第二行給我「請求在'list'中的成員'push_back',它是非類類型'int'」。我想這不是我的一天,所以我現在就停止打擾你。 – xcel

+0

你會發布你正在編譯的代碼嗎?在我看來,你試圖在'main()'裏面定義'MyClass' ...(閱讀:http://stackoverflow.com/questions/876048/why-can-i-define-structures-and-類中之函數式-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); 
    } 
}