【问题标题】:Setter for std::vectorstd::vector 的设置器
【发布时间】:2017-06-02 10:18:41
【问题描述】:

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

class Model {
    ...

    private:
    biosim::CreatureList list;

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

生物列表:

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

我用谷歌搜索后发现有人说我应该尝试的帖子

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()); }

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

对不起,如果我的英语很烂,那不是我的母语。

【问题讨论】:

  • biosom::CreatureList 是什么?如果它不能被复制,那么你不能复制它,可能你不应该复制它
  • 另外,在const 引用上使用std::move 显然是错误的。
  • 您发布的错误消息表明 biosim::CreatureType 不可复制分配。它有不可复制的成员吗?

标签: c++ vector stl std setter


【解决方案1】:

如果要存储,按值取:

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

这将复制所有值,因此您还需要提供一种方法来复制您的 CreatureType(这就是 CreatureType::operator =(const biosim::CreatureType &amp;) 错误的含义)。

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

Model m;
m.list = list;

【讨论】:

  • 感谢您的快速回复。将您的成员公开是否有益?我刚开始学习 C++(正如你所看到的,不得不问这些问题:D),但我在学校学习了 Java,我们被告知要始终将我们的成员设为私有并与 getter 和 setter 一起工作
  • @Awesome36 是的,如果您的 setter 是 getter 微不足道,则可以将成员公开。如果没有要保持的内部不变量,则直接公开成员相当于更少和更简单的代码。 SO上有很多关于这方面的信息。
  • @Awesome36 Java 的建议(主要)来自错误的信念,即在仪式中包装突变可以保留封装。这种信念导致了 JavaBean 风格,这是许多 Java 工具所期望的。更好的建议是将字段设为私有并将更改它们的函数放在类中。
【解决方案2】:

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

class CreatureType {
  public:
    CreatureType();                // default constructor
    CreatureType(const CreatureType& other);  // copy constructor
    CreatureType(CreatureType&& other); // move constructor
    CreatureType& operator=(const CreatureType& other); // copy operator
    CreatureType& operator=(CreatureType&& other); // move operator

  // ...
};

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    相关资源
    最近更新 更多