2016-04-30 10 views
0

私はプログラムを作成しています。マップからオブジェクトを取得し、オブジェクトの値を更新する必要があります。ここに私のデータクラスからの私のコードの一部である:ここでマップ内の要素の値を更新する方法C++

StockHolding& StockData::findHolding(const string &ticker) { 
StockHolding var; 
var = portfolio[ticker]; 
return var; 
} 

はdata.hクラスのコードは次のとおりです。

typedef std::map<std::string, StockHolding>StockMap; 
class StockData 
{ 
private: StockMap portfolio; 
private: string portfolioFile; 
private: void splitString(vector<string> &, const string &, char); 
public: 
StockData(); 
StockData(const string &); 
void addHolding(StockHolding &); 
void readPortfolioFile(); 
StockHolding& findHolding(const string &); 
void display(); 
void writePortfolioFile(); 
}; 

そしてここでは、私のドライバークラスからのコードは次のとおりです。

main(){ 
StockHolding sH = sD.findHolding("APPL"); 
sH.setPrice(5); 
sD.findHolding("APPL").setShares(15); 
sD.display(); 
sD.writePortfolioFile(); 
} 

答えて

2

StockData::findHoldingには、ローカル変数varが宣言されています。この変数はマップ内の要素とは関係がないため、変更しても効果はありません。

varは参照によって返されますが、関数の外に出るとvarが破棄され、返された参照にはダングリングが発生します。

あなたは参照することにより、直接mapの要素を返すかもしれません。そして、

StockHolding& StockData::findHolding(const string &ticker) { 
return portfolio[ticker]; 
} 

StockHolding& sH = sD.findHolding("APPL"); 
sH.setPrice(5); 
sD.findHolding("APPL").setShares(15); 

は動作します。参考としてsHも宣言する必要があります。

1

危険! findHoldingでは、StockHolding var;はローカルです。それを参考にして返すことは、あなたが望むことをするのに失敗し、おそらくブームになります。

StockHolding& StockData::findHolding(const string &ticker) { 

StockHoldingへの参照を返します。

StockHolding var; 

OK。我々はStockHoldingを持っています。カッコいい。

var = portfolio[ticker]; 

コピーvarからportfolioからStockHolding

return var; 

ローカル変数varへの参照が不正です。 varが死にそうです。しかし、varには、とにかく必要なデータのコピーのみが含まれています。オリジナルはportfolioにあり、コピーに加えられた変更によって変更されません。これは、現在ダングリングしている参照を使用してもプログラムが終了しないと仮定しています。

} 

あなたは可能性が高いだけで働いていた

return portfolio[ticker]; 
+0

をしたいです!ありがとう! – user3344862

+2

ありがとうございますが、答えの確認はsongyuanyaoに転送してください。彼は私が見逃した何かを見つけました。帰国後の変数を参照する必要があります。もう1〜2分であなたを得ることができます。 – user4581301