2009-11-12 70 views
1

C++中,爲什麼以下元素訪問vector無效?爲什麼這個語法無效? vectorPointer - > [0]

void foo(std::vector<int>* vecPtr) { 
    int n = vecPtr->size(); // ok 
    int a = vecPtr->[0]; // invalid 
} 

相反,我們必須寫這樣一個方法調用較爲煩瑣

(*vecPtr)[0] = 1; 

我想,operator[]調用應該只是有相同的語法,我恨多餘的明星和括號。 (我知道C++有很多更嚴重的問題,但是這一次讓我很煩,每次當我必須鍵入它...)

+1

不是答案,但爲什麼你傳遞一個指向矢量的指針,而不是通過引用傳遞矢量?這將使函數內的函數更簡單,同時明確指出調用者代碼負責矢量的生命週期。 – 2009-11-12 07:18:13

回答

12

這是因爲語言需要一個成員->後出現。這就是語言的組成部分。您可以使用函數調用語法,如果你喜歡

// not really nicer 
vecPtr->operator[](0); 

如果你必須這樣做很多順序,使用[0]代替括號可以提高可讀性大大

vecPtr[0][0] 

否則,對於一個級別,我發現(*vecPtr)[0]對我來說是完全可讀的。

+7

+1另外,你可以將矢量分配給裁判,這就是它! – AraK 2009-11-12 04:50:06

+0

但運算符[]是成員。 – Frank 2009-11-12 04:50:44

+0

「操作員作爲方法調用」的好工作......你擊敗了我:) +1 – jheddings 2009-11-12 04:51:04

0

你似乎已經知道這應該是無效的語法,所以有什麼問題?所寫的唯一答案是「因爲這是寫這種語言的方式」。

在語義上,這是因爲該[]操作基本上說「計算從所提供的地址的偏移量」;它不是一種方法,它是一個操作員。你給的語法並不是真的覺得它有道理。

而且,因爲你描述的語法看起來很可怕,因爲你只是在一個光禿禿的運營商,而不是預期的成員指出。

考慮使用參考,如果你想更直接的關於你的間接性(符號崩潰)。

+1

它是std :: vector的一種方法:: vector – 2009-11-12 04:53:03

+1

不,這是一種方法,如果你把它寫成一個方法。正如所寫的,它是一個運營商(儘管如此,但運營商超負荷運營)。 – phoebus 2009-11-12 05:04:16

5

除了litb's nice answer我應該說,沒有在vector類的函數at,允許您按如下方式使用它:

int a = vecPtr->at(0); 

這個成員函數和成員運算功能operator[]之間的區別是,​​通過拋出out_of_range異常來發出請求的位置超出範圍的信號。