我在一个类中有以下代码:
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);
但是参数向量的大小在上面的调用之后仍然是0。
我必须添加以上addOneParams(Parameter* param)
方法,才能将项目添加到参数向量中。为什么呢?
答案 0 :(得分:14)
getParamVector()
会返回params
的副本。因此,当您push_back
加入其中时,您会添加一个立即被删除的临时vector
。这绝不会影响params
的大小。
如果您希望能够通过getParamVector()
执行此操作,则必须将参考返回params
而不是:
std::vector<Parameter*>& getParamVector() {return params;}
^^^
答案 1 :(得分:3)
您应该按引用返回引用或指针。
std::vector<Parameter*>& getParamVector() { return params; }
或
std::vector<Parameter*>* getParamVector() { return ¶ms; }
但是,这是一个真正的问题:如果你已经有一个可以添加一个参数的方法,你为什么需要调用getParamVector()。push_back()。
相反,你可以做classA_ptr-&gt; addOneParam(p)。
编辑:对我来说,addOneParam()强制数据隐藏比获取内部向量的引用/指针更好。
如果存储参数的数据结构发生变化,则还需要修改调用者。
使用addOneParam(),调用者是绝缘的。