2012-01-11 55 views
3

我是一個C++ noob程序員...(我通常使用Java),現在我有一些指針,參考和載體的問題...如何檢索C++中的向量內的對象

我需要提取vector<Object> objects一個Object和簡單起見,我想用來存儲另一個對象他提到因爲我需要編輯它裏面的一些參數多次

這是到目前爲止,我寫的代碼:

Object myObject = getMyObject(id, objects); 

getMyObject簡單地實現了for週期指找到合適的object用正確的id並與return objects[i]

返回,但如果我的理解沒錯,這種方法複製的對象!所以,在myObject有一個完全不同的Object,是嗎?

我該怎麼辦?

非常感謝!

+0

但是你說「我想將它存儲在另一個對象中」...然後你有一個副本,對吧?你不能有一個對象存儲在一個數組中,而同一個對象也存儲在其他地方。 – 2012-01-11 15:10:19

+0

如果你知道你有指點或參考的「問題」,或許首先爲你的未來發展「解決這些問題」是一個好主意。這些概念也可能在其他語言(如Java)中有用,以瞭解事情的工作原理。 – ereOn 2012-01-11 15:11:53

+0

是的......你說得對,我的意思是我想訪問那個確切的對象 – Janky 2012-01-11 15:14:23

回答

1

你是對的。你應該做的是有get函數返回一個參考:

Object & getMyObject(int id, std::vector<Object> & objects) 
{ 
    // ... find ... 
    return objects[i]; 
} 

那麼這個綁定到你的用戶代碼中的另一個參考:

Object & theobject = getMyObject(12, all_objects); 

現在通過參考theobject直接修改包含的元素。

如果你不希望/你需要修改的對象,只是對其進行檢查,你應該做參考(以及容器)const

Object const & getMyObject(int id, std::vector<Object> const & objects); 
+0

不提指針?如果他需要重新入座怎麼辦? – 2012-01-11 16:13:22

3

是的,您需要使用指針或引用,否則您顯示的行將調用Object的複製構造函數。

你可以讓getMyObject返回Object*,然後你有一個指向對象的指針,你可以將它分配給另一個Object*

或者,將myObject定義爲參考:Object& myObject

無論如何,您必須確保您要返回的對象是動態分配的,而不是作爲getMyObject()中的局部變量進行分配,否則會導致訪問衝突。

您還必須確保釋放該對象以防止內存泄漏。

+1

@Janky:這是一個快速清除疑惑的好地方:http://www.parashift.com/c++-faq-lite/references.html。如果你有時間,你應該閱讀所有內容。 – 2012-01-11 15:11:55

+0

我會讀它肯定!謝謝! – Janky 2012-01-11 15:52:50

2

如果你不想複製對象,那麼你需要一個引用或指針。問題在於參考或指針可能很容易失效。如果你不希望發生這種情況,那麼你應該在你的向量中存儲指針。特別是對於這種情況,你很可能想要shared_ptr。

std::shared_ptr<Object> getMyObject(foo id, 
    const std::vector<std::shared_ptr<Object>> & objects) 
{ 
    // ... find object 
    ... 
    return objects[i]; 
} 
... 
std::vector<std::shared_ptr<Object>> objects; 
objects.emplace_back(new Object(parameters)); 
... 
std::shared_ptr<Object> x = getMyObject(id, objects); 
1

請記住,STL總是副本,除非另有規定。但是,vector()和operator []都返回一個引用。

,如果你想改變它的內部集合的對象,您需要

Object& myObject = objects.at(id); 

Object myObject = objects.at(id); 

會給你一個副本。

0

將指針存儲在容器中的原始對象上。

Object* obj1 = new Object(); 
Object* obj2 = new Object(); 

vector<Object*> myVector; 
myVector.push_back(obj1); 
myVector.push_back(obj2); 

Object* tmpObj = myVector.at(0); 
+1

雖然原始指針和'new'真的很糟糕的C++建議。 – 2012-01-11 15:21:46