我正在制作一个程序,我需要从地图中获取和对象并更新对象的值。以下是我的数据类中的一些代码:
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();
};
这是我的Driver类中的代码:
main(){
StockHolding sH = sD.findHolding("APPL");
sH.setPrice(5);
sD.findHolding("APPL").setShares(15);
sD.display();
sD.writePortfolioFile();
}
答案 0 :(得分:2)
在StockData::findHolding
中,您要声明一个与地图中的元素无关的局部变量var
,因此对其进行修改不会产生任何影响。< / p>
并且引用返回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 :(得分:0)
危险!在findHolding
中,StockHolding var;
是本地的。将它作为参考将其作为参考将无法做你想做的事情并且可能会繁荣。
StockHolding& StockData::findHolding(const string &ticker) {
表示该函数返回对StockHolding
的引用。
StockHolding var;
行。我们有StockHolding
。那很酷。
var = portfolio[ticker];
将StockHolding
从portfolio
复制到var
。
return var;
返回对局部变量var
的引用,这是不好的。 var
即将死去。但var
只包含您想要的数据副本。原件位于portfolio
中,对副本所做的任何修改都不会更改。假设使用现在悬挂的参考文件并不会导致你的程序失效。
}
你可能只想要
return portfolio[ticker];