2016-04-22 65 views
3

爲什麼大小低於向量是0?修改參考返回的向量

#include <iostream> 
#include<vector> 
using namespace std; 
class A 
{ 

    public: 
     vector<int> T; 
     const vector<int>& get(){ 
      return T; 
     } 
     void print(){ 
      cout<< " size is "<<T.size(); 
      // cout<<" \nelements are %d "<<T[0]; 
     } 
}; 
int main() 
{ 
    cout << "Hello World" << endl; 
    A ob; 
    vector<int> temp = ob.get(); 
    temp.clear(); 
    temp.push_back(3); 
    temp.push_back(5); 

    ob.print(); 
    return 0; 
} 
+0

有沒有機會,你的意思是'矢量&get()const'而不是'const vector &get()'? – Eekan

回答

4

這是因爲它沒有發生任何事情。它仍然是空的。

您製作了temp中的矢量副本,並且您修改了副本,而不是原始類成員。你應該用一個參考:既然你是從get()返回參考

vector<int> &temp = ob.get(); 

,你必須把它分配給一個參考。如果你不這樣做,你只是製作一個對象的副本。

編輯:此外,更改get()返回一個可變引用,而不是const引用。

+2

請注意'get()'返回一個** const **引用,它不能被分配給**非const **引用。 get()'的簽名需要將'const'放在返回值上,以便上面的代碼(這是此問題的正確解決方案)能夠正確編譯。 –

3

您並未修改A類中的vectorget()返回(常量!)引用,您就可以看到分配給一個非參考變量,所以複製正在創建vector。然後,您正在修改副本但打印出原件。

你需要做這個:

#include <iostream> 
#include <vector> 

using namespace std; 

class A 
{ 
    public: 
     vector<int> T; 

     vector<int>& get(){ 
      return T; 
     } 

     void print(){ 
      cout << " size is " << T.size(); 
      // cout << " \nelements are %d " << T[0]; 
     } 
}; 

int main() 
{ 
    cout << "Hello World" << endl; 

    A ob; 
    vector<int> &temp = ob.get(); 
    temp.clear(); 
    temp.push_back(3); 
    temp.push_back(5); 

    ob.print(); 
    return 0; 
} 
2

兩個問題。

首先,您的A::get()方法會爲其成員返回一個const引用。你不能通過const引用修改向量。

其次,您正在修改temp矢量,該矢量只是返回值的副本。