2015-06-02 59 views
1

請跟我聯繫,這是我第一次發佈。我有3個班。班級供應商有一套班級家長。類父級具有類位置的向量,類位置具有數據記憶器。 EX(這是僞代碼,不是我實際的代碼我只顯示此爲簡單起見):如何將C++中的類實例推回到vector上

Class Suppliers{ 
set<Parent> setter; 
}; 
Class Parent{ 
vector<location> loc; 
}; 

`

以下是我創建的位置類的構造函數。我碰到沒有問題,直到我用迭代器擊中兩條線。我正試圖找到一個特定的Parent,並將一個新位置推回到Parent'loc'向量中。所以我傳入我以前找到的迭代器作爲參考。但只要我試圖推回我的位置類的新實例,我會收到以下錯誤。

data.cpp:139:33:error:將'const std :: vector'作爲'void'參數傳遞給'void std :: vector < _Tp,_Alloc> :: push_back(const value_type &)[with _Tp =地點; _Alloc = std :: allocator; std :: vector < _Tp,_Alloc> :: value_type = location]'丟棄限定符[-fpermissive]

最後一行還給出了一個錯誤,說我不能改變一個只讀對象。我很困惑,爲什麼這將是一個只讀對象。我做了一些研究,並認爲我需要添加一個拷貝構造函數。但是,這導致了比解決問題更多的問題。有任何想法嗎?

location::location(set<Parent>::iterator &it, vector<string> v){ 


sup_id = v[0]; 
address1 = v[2]; 
address2 = v[3]; 
city = v[4]; 
state = v[5]; 
country = v[6]; 
zip = v[7]; 
((*it).loc).push_back(*this); 
((*it).num)++; 



} 
+0

除了@Daniel Frey的回答,你的代碼設計非常差,因爲在它自己的構造過程中,你不應該傳遞實例的指針**。 –

+0

@Alexandre Severino,當我初始化對象並創建一個指向對象的指針並將其推回(在構造函數之外)時,你會建議嗎? – Katie

+0

你有沒有考慮過使用**工廠模式**?你可以創建一個'static'方法,爲它自己的類調用'private constructor',當它被正確實例化時,添加到列表中。所有在這個靜態方法。 更多信息:http://www.codeproject.com/Articles/363338/Factory-Pattern-in-Cplusplus –

回答

2

的問題是,一個set排序。如果您可以通過迭代器更改元素,則基本上意味着您可能會使迭代器無效,因此,由於C++ 11,的set常數雙向迭代器,因此具有相同語義作爲集合的const_iterator

該解決方案雖然稍微難看,但是要刪除,修改和重新插入元素。有一個建議允許修改關聯容器的關鍵字,但我不知道是否有任何標準化進展。

+0

謝謝!今天經過更多的研究之後,我得出了類似的結論,並實施了一張地圖。地圖中的值不使用常量迭代器。 – Katie

相關問題