2012-05-27 180 views
0

我有下面的代碼拆分頭和源文件。在函數插入它的狀態AllBridges矢量沒有初始化(它似乎甚至不認識它?)和nextBridge沒有分配一個值 - 除了我想我在構造函數?爲什麼我不能訪問我的成員變量?

#include <vector> 

using namespace std; 

class Bridge 
{ 
    public: 
     Bridge(int); 
     void insert(Bridge); 

    private: 

     int nextBridge; 
     vector<Bridge> AllBridges; 
}; 


#include "StdAfx.h" 
#include "Bridge.h" 

using namespace std;   

    Bridge::Bridge(int size){ 
     AllBridges.reserve(size); 
     nextBridge= 0;  
    } 

    void insert(Bridge AddBridge){ 
     AllBridges[nextBridge] = AddBridge; 
    } 
+0

您應該使用成員初始值設定項語法來初始化構造函數中的變量,而不是顯式賦值語句。 – chris

回答

6

應的

void Bridge::insert(Bridge AddBridge) 

代替

void insert(Bridge AddBridge) 
+0

@JerryCoffin我剛剛看到錯誤信息和原因。在你的回答中你解釋得很好。此外,我確信一旦他編譯並運行代碼,他自己就會看到問題。可以是一個很好的學習體驗。 –

+0

公平 - 你回答他問的問題,而不是他應該問的問題。 :-) –

+0

@JerryCoffin我真的沒有讀到整個事情(不合格的名字彈出)。也許我應該有。現在編輯沒有意義。 –

2

調用上std::vectorreserve確保它有足夠的能力來舉辦這樣的很多元素,如果加入他們。它不調整矢量大小,它只會改變它的容量。你在找什麼是resize

您在您的insert成員函數定義中也缺少Bridge::

3

您正在嘗試複製已經屬於vector的功能。

您應該讓vector完成自己的工作,並跟蹤您插入了多少bridge,而不是自己跟蹤nextBridge。取而代之的insert荷蘭國際集團在指定位置,你只需要使用push_back添加到vector結束,所以你的代碼變成:

Bridge::Bridge(int size){ 
    AllBridges.reserve(size); 
} 

void Bridge::insert(Bridge AddBridge){ 
    AllBridges.push_back(AddBridge); 
} 

...你可以簡單地從你的Bridge定義中刪除nextBridge完全。另外,我認爲你正在犯一個根本的錯誤:你將一座橋的概念與所有橋樑的概念混爲一談。這是一個常見的錯誤(有時候肯定不是初學者),但它幾乎不可避免地導致問題。舉例來說,您插入到AllBridges中的每個Bridge都有自己的AllBridges(這可能是空的,但是誰知道)。

你真的想Bridge只是代表單橋,然後(如有必要)有一個單獨的類型來表示橋樑的集合 - 如果它確實增加了一些超出std::vector<Bridge>有用。

編輯:我想我應該添加一個其他的可能性:也許你真的想要Bridge類型來跟蹤自己的所有實例的實例化。如果是這樣,你想讓你的成員,所以你有一個它的類的實例,而不是它的一個單獨的實例,每個對象的類。

相關問題