2015-05-29 50 views
3

我有一個類下面的代碼:爲什麼我不能將項目添加到我的矢量中?

class A 
    { 
     std::vector<Parameter*> params; 
     std::vector<Parameter*> getParamVector() {return params;} 
     void addOneParam(Parameter* param) 
     { 
      params.push_back(param); 
     } 
    } 

在另一類,B類,我嘗試這樣做,將項目添加到PARAMS載體:

classA_Ptr->getParamVector().push_back(aParamPtr); 

params矢量的大小仍然爲0,以上調用後。

我必須添加addOneParams(Parameter* param)以上的方法才能將項添加到params向量中。爲什麼?

+0

幾天前我有一個類似的問題。你可以看到這裏: http://stackoverflow.com/questions/30114553/why-cant-i-pushback-a-new-element-to-a-list – Andrinux

回答

14

getParamVector()返回拷貝params。因此,當您將其上push_back添加到臨時vector時,會立即刪除。這絕不會影響params的大小。

如果你希望能夠通過getParamVector()做到這一點,你就會有一個參考返回params代替:

std::vector<Parameter*>& getParamVector() {return params;} 
         ^^^ 
+1

如果我想返回一個向量的指針,它應該是這樣的:std :: vector​​* getParamVector(){return&params;}? – peterboston

+0

@peterboston是的,該語法是正確的。不同之處在於,返回一個引用可以讓你更清楚地知道你正在返回一個實際的對象,而返回一個指針可能意味着調用者需要檢查'nullptr'。 – Barry

3

您應該返回通過引用或指針指出。

std::vector<Parameter*>& getParamVector() { return params; } 

std::vector<Parameter*>* getParamVector() { return &params; } 

但是,這裏是真正的問題:如果你已經有一個可以加一個參數,爲什麼你需要調用getParamVector()的方法的push_back()。

相反,你可以做classA_ptr-> addOneParam(p)。

編輯:對我addOneParam()強制執行數據隱藏比得到參考/指向內部向量更好。

如果存儲參數的數據結構發生變化,調用者也需要修改。

使用addOneParam(),調用者被隔離。

+0

他還沒有可以添加一個參數的方法,他不得不添加它。他想擺脫它! – CinCout

相關問題