2013-11-04 55 views
5

我是一位專家級的Java程序員,試圖將我的知識移植到C++中。這不是家庭作業,只是一個我試圖學習C++的概念。C++ - 將對象添加到std :: vector中,在循環中實例化

我想要做的是使用循環「生成」自定義類型的對象列表。這是我如何在Java中做到這一點:

public class TestClass 
{ 
    private ArrayList<ExampleClass> _exampleObjects; 
    private int _numObjects = 10; 

    public void populateList() 
    { 
     _exampleObjects = new ArrayList<ExampleClass>(); 

     for(int i = 0; i < _numObjects; i++) 
     { 
     _exampleObjects.add(new ExampleClass()); 
     } 
    } 

    public void doStuffWithListItems() 
    { 
     for(ExampleClass e : _exampleObjects) 
     { 
     e.performAction(); 
     } 
    } 
} 

超級簡單的東西。創建一個列表,遍歷一個任意的循環並向它添加對象。然後,循環訪問這些對象並將其用於任何目的。

TestClass.h:

class TestClass 
{ 
    public: 
     // Constructor, copy constructor, destructor definitions 

     void populateList(); 
     void doStuffWithListItems(); 
    private: 
     std::vector<ExampleClass> _exampleObjects; 
     const int _numObjects = 10; 
}; 

TestClass.cpp:

void TestClass::populateList() 
{ 
    for(int i = 0; i < _numObjects; i++) 
    { 
     ExampleObject obj; 
     _exampleObjects.push_back(obj); 

     /* What actually goes here in place of obj? */ 
    } 
} 

void TestClass::doStuffWithListItems() 
{ 
    for(auto it = _exampleObjects.begin(); it != _exampleObjects.end(); it++) 
    { 
     /* What do i do with my iterator to access my object? */ 
    } 
} 

它我的理解是,我在初始化第一個循環我的對象,他們走出去的範圍和最終死亡每個循環迭代。是對的嗎?如果是這樣,我該如何創建一個持久化實例?

我用shared_ptr <>進行了實驗,顯然能夠持久地存儲它們,但是在我的生活中卻無法解決如何從shared_ptr的迭代器中取消引用。

我覺得這應該是一個非常簡單的概念。我似乎無法解決這個問題。我已經閱讀了很多關於C++範圍和循環的內容。我似乎無法在兩者上找到任何東西。

回答

5
ExampleObject obj; 
_exampleObjects.push_back(obj); 

/* What actually goes here in place of obj? */ 

沒有。你有什麼是正確的,假設ExampleClass有一個工作拷貝構造函數。如果你的編譯器支持C++ 11(並且因爲你使用的是auto,它至少部分是這樣),你可以保存一份副本。

_exampleObjects.emplace_back(); 

這在載體構建體在適當位置的對象,轉發的參數(在這種情況下無)至一個匹配的構造(默認構造函數,在這種情況下)。對於從迭代器訪問對象,請執行以下操作:

for(auto it = _exampleObjects.begin(); it != _exampleObjects.end(); it++) 
{ 
    it->performAction(); 
} 

同樣,C++ 11在這裏可以使事情變得更好。

for(auto & obj : _exampleObjects) 
{ 
    obj.performAction(); 
} 

它我的理解是,我在初始化第一 環路我的對象,他們走出去的範圍和每個循環迭代結束時死亡。

正確。

如果是這樣,我該如何創建一個持久化實例?

vector<>::push_back照顧這個。它將參數複製到矢量中。換句話說,它不是在循環中創建的同一個對象,而是一個副本。您只需確保ExampleClass具有非破壞的複製語義。

不能爲我的生活工作如何從 迭代一個shared_ptr的非關聯<>

如果你有一個迭代器共享指針的向量,(稱之爲it ),你會取消對它的引用,並調用存儲對象的成員函數,就像這樣:

(*it)->performAction(); 
// alternatively 
(**it).performAction(); 
+0

謝謝。這是一個理想的答案。 :D –

+0

@ScottDrew:我添加了一些額外的信息來澄清你在代碼之後提出的問題,以防你仍然在想這件事。 –

+0

謝謝,額外的信息確實有幫助。我覺得我現在已經開始充分掌握C++,以便在真正的項目中實際使用它。閃電般的快速回答我無法感謝你。 –

1

理想的答案表明,一個非常糟糕的主意 - 使用後增量++在循環迭代。 你永遠不應該在循環中使用它,你只需要迭代,因爲postincrement必須返回迭代器在增量之前的值;所以,以前的值需要在之前的某處複製。 從性能角度來看,這只是一個不好的代碼風格標誌。

+0

你說得很好。雖然我並不是真的提出了後增量,但我只是複製了OP的循環,因爲這不是問題所在。 –

相關問題