setd for std :: vector

时间:2017-06-02 10:18:42

标签: c++ vector stl std setter

所以我正在为我的学校项目实现一个设计模式,它包含类Model:

class Model {
    ...

    private:
    biosim::CreatureList list;

    public:
    biosim::CreatureList getList() const;
    void setList(const biosim::CreatureList& list);
};

CreatureList:

typedef std::vector<CreatureType> CreatureList;

我想在此类中设置一个包含我的Creatures的向量,以便稍后可以在Presenter-Class中访问它。

首先,我试过了:

void Model::setList(const biosim::CreatureList& list) { this->list=list; }

但它给了我以下错误:

'biosim::CreatureType &biosim::CreatureType::operator =(const biosim::CreatureType &)': attempting to reference a deleted function

我用Google搜索后发现有人说我应该尝试

void Model::setList(const biosim::CreatureList& list) { this->list=std::move(list); }

但它给了我同样的错误。

现在我使用

进行编译
void Model::setList(const biosim::CreatureList& list) { this->list.assign(list.begin(), list.end()); }

但我不确定,如果这是一个很好的解决方案。 有人可以向我解释,为什么上面的行导致错误而最后一行有效?更重要的是:最好的方法是什么?

对不起,如果我的英语很糟糕,那就不是我的母语了。

2 个答案:

答案 0 :(得分:2)

如果您想存储,请按值进行存储:

void Model::setList(biosim::CreatureList list) { 
    this->list = std::move(list);
}

这会复制所有值,因此您需要提供一种复制CreatureType的方法(这就是CreatureType::operator =(const biosim::CreatureType &)错误的内容)。

话虽如此,如果您提供存储方式,为什么不将该会员公开?

Model m;
m.list = list;

答案 1 :(得分:2)

问题是,似乎CreatureType类型的元素不是trivially copyable.所以你应该实现一个复制/移动构造函数,以便能够复制/移动向量中包含的数据(比你可以复制/移动向量,因为vector实现了移动语义):

    if (!File.Exists(path)) // append only if file doesnt exist
    {
        using (StreamWriter sw = File.AppendText(path))
        {
            for (ctrl = 0; ctrl < 5 ; ctrl++)
            {
                sw.WriteLine(OrigProductItems[ctrl] + "\t" + OrigProductQty[ctrl] + "\t\t" + OrigProductPrice[ctrl]);
            }
        }
    }

检查"The rule of three/five/zero".