我在双端队列中有const对象:

class ConstClass {
  public:
    ConstClass(int variable): variable_(variable) {}
  private:
    const int variable_;
};

std::deque<ConstClass> objects;
objects.push_back(ConstClass(1));
objects.push_back(ConstClass(2));
objects.push_back(ConstClass(3));

如何用另一个替换第二个元素?

如果我尝试使用[] =std :: replace来执行此操作,则会得到:

编译器无法为类'ConstClass'生成operator =

我能想到的唯一方法是创建一个空的双端队列, push_back()从那里的“对象”中所有元素(用新的元素替换第N个元素),然后清除() “对象”双端队列并把复制的push_back()元素从临时双端队列返回到“对象”。

我敢肯定还有一种更明智的方法,但是我不知道怎么做?

===============>>#1 票数:3 已采纳

你不能 您的容器无效,因为其元素类型必须是可复制分配的或可移动分配的,而您的容器和容器都不是。 在构造时无法诊断出该错误,但是当您尝试执行依赖于此属性的操作时,您已经看到产生的编译错误。

您可以通过重载元素类型的复制和移动赋值运算符来忽略const成员,从而使其合法且可编译,但是尚不清楚这是否有意义。

std::unique_ptr到动态分配的对象中,或者重新考虑模型。

===============>>#2 票数:1

该问题的更多背景信息将是有用的,您如何在这里结束? ConstClass的目的是什么,为什么必须是const?

假设有充分的理由您不能在没有黑客的情况下解决此问题,可以这样做:

int main() {

   std::deque<std::shared_ptr<ConstClass>> objects;
   objects.push_back(std::make_shared<ConstClass>(1));
   objects.push_back(std::make_shared<ConstClass>(2));
   objects.push_back(std::make_shared<ConstClass>(3));

   objects[2] = std::make_shared<ConstClass>(100);
}

但是肯定有更好的方法...

(您可能想使用unique_ptr而不是shared,所以我不确定您的要求是什么。如果您使用的是较旧的平台,则boost shared_ptr也可以使用)

===============>>#3 票数:1

通过指定const成员,您将禁用默认的赋值运算符,并且您不应做任何招数/技巧来克服该限制。

您可以改为使用智能指针(如果需要共享所有权,则可以是唯一的或共享的),例如:

int main(){
    std::deque<std::unique_ptr<ConstClass> > objects;
    objects.push_back(std::unique_ptr<ConstClass>(new ConstClass(1)));
    objects.push_back(std::unique_ptr<ConstClass>(new ConstClass(2)));
    objects.push_back(std::unique_ptr<ConstClass>(new ConstClass(3)));

    objects[2]=std::unique_ptr<ConstClass>(new ConstClass(4));
    // or any other usage of assignment operator, depending on the needs
}

  ask by riot_starter translate from so

未解决问题?本站智能推荐:

关注微信公众号