2012-02-11 31 views
3

我有一個類:傳遞載體類不復制

SomeClass的頭部代碼:

class SomeClass{ 
    SomeClass(); 
    vector<int> somePointerVector; 

    public: 
    SomeClass(vector<int> &someVector); 
}; 

林有點困惑如何在這裏使用的載體。我想設置somePointerVector = someVector,以便我可以使用somePointerVector在某個Vector的其他部分處理數據,並且我也不想複製someVectors的所有數據。

使用數組我有做到這一點:

int* somePointerArray = someArray; 

但我怎麼才能做到這一點與引導?

回答

4

somePointerVector作爲參考,並將其放在您班級的initialization list中。 (並請給它一個更好的名字。)

class SomeClass 
{ 
    vector<int> &somePointerVector; 

    public: 
    SomeClass(vector<int> &someVector) 
     : somePointerVector(someVector) 
    {} 
}; 
+0

很酷,不知道初始化列表是否存在。 Jw,用多個初始化格式化初始化列表的正確方法是什麼? – HighLife 2012-02-11 19:30:50

+1

好吧,你在逗號之間插入逗號;這正是編譯器所關心的。我會把不同的成員放在不同的行上,並將它們與第一個(不是':')對齊,但是它們有不同的格式。 – 2012-02-11 19:32:04

0

如何

class SomeClass { 
    vector<int> myVector; 

    void MyMethod(vector<int>* theVector); 
} 

,並在你的方法

void SomeClass::MyMethod(vector<int>* theVector) 
{ 
    theVector->push_back(7); 
} 

去過的年齡,因爲我用STL的工作,但我認爲這是的push_back ?

哦,要使用索引,你可以只(* theVector)[2] ...

2

要了解最合適的解決方案,你需要了解「SomeClass的」和載體的壽命和所有權它已通過。例如,如果SomeClass通過引用接受向量,那麼構造SomeClass的代碼需要確保向量的生命週期大於SomeClass的生命週期 - 否則SomeClass可能會以不再有效的引用結束。或者,如果構造SomeClass的代碼想要「移交」向量的責任(並且您有一個編譯器和STL實現,那麼這個實現是通過引用傳遞的,所以SomeClass不會「 'r-value reference aware'),那麼你可以傳遞一個r值引用給vector;

class SomeClass { 
    vector<int> data_; 

public: 
    SomeClass(vector<int>&& data) : data_(data) 
} 

然後構造SomeClass的代碼;

vector<int> data; 
data.push_back(1); 
data.push_back(2); 
data.push_back(3); 
data.push_back(4); 

SomeClass someClass(std::move(data)); 

在這種情況下,你已經「移動」的載體導入SomeClass的,以避免複製和SomeClass的已經「採取所有權」的「數據」的。