为什么我不能在我的矢量中添加项目?

时间:2015-05-29 03:09:16

标签: c++ vector

我在一个类中有以下代码:

    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)方法,才能将项目添加到参数向量中。为什么呢?

2 个答案:

答案 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 &params; }

但是,这是一个真正的问题:如果你已经有一个可以添加一个参数的方法,你为什么需要调用getParamVector()。push_back()。

相反,你可以做classA_ptr-&gt; addOneParam(p)。

编辑:对我来说,addOneParam()强制数据隐藏比获取内部向量的引用/指针更好。

如果存储参数的数据结构发生变化,则还需要修改调用者。

使用addOneParam(),调用者是绝缘的。