2017-04-05 59 views
1

C++ |不能將項目添加到我有這個類的類成員矢量

class CAppFramework : public IBaseApp 
{ 
public: 
    CAppFramework(std::initializer_list< CClientApp* > input); 
    CAppFramework(); 
    ~CAppFramework(); 

    void Create() override; 
    void Release() override; 

    std::vector< CClientApp* > GetClientApps(); 

private: 
    std::vector< CClientApp* > m_ClientApps; 
}; 

當我嘗試將項目添加到m_ClientApps載體是這樣的:

int main() 
{ 
    CAppFramework appframework = CAppFramework(); 
    appframework.GetClientApps().push_back(new CTest()); 

    appframework.Create(); 
    appframework.Release(); 

    return 0; 
} 

它失敗。矢量的大小保持爲0

但是如果我添加項目是這樣的:

int main() 
{ 
    CAppFramework appframework = CAppFramework({ new CTest() }); 

    appframework.Create(); 
    appframework.Release(); 

    return 0; 
} 

該項目得到成功添加。這是爲什麼? 我希望有人能幫助我。

再見,祝你有美好的一天!

+2

'GetClientApps'返回副本的時候,應該返回一個參考。 – nwp

回答

1
std::vector< CClientApp* > GetClientApps(); 

這由值返回向量。該矢量的副本實際上是作爲該函數的返回值。

appframework.GetClientApps().push_back(new CTest()); 

push_back()是個新值被返回矢量對象,這是原始矢量的副本,即得到立即在這個表達式的端破壞臨時值。 push_back()完成沒有用處。

您需要通過參考返回向量,而不是值:

std::vector< CClientApp* > &GetClientApps(); 
+0

我明白了,非常感謝! – user7814615

+0

你碰巧碰巧是一個正在嘗試學習C++的Java背景的人嗎?如果是這樣的話,您需要快速取消對Java中對象的所有知識。否則,你會繼續回到這裏... –

+0

是的,我來自java:|。你以前學過這東西很不幸。 – user7814615