我在deque中有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 =
我能想到的唯一方法是在那里创建空deque, push_back()来自'objects'的所有元素(用新的元素替换第N个元素),然后 clear ()'objects'deque和 push_back()复制的元素从temp deque回到'objects'。
我确信有更明智的方法可以做到,但我不知道怎么做?
答案 0 :(得分:3)
你做不到。您的容器无效,因为其元素类型必须是可复制的或可移动分配的,而您的容器不是。这不是在构造时诊断出来的,但是当您尝试执行依赖于此属性的操作时,您已经看到了导致的编译错误。
您可以通过重载副本并移动元素类型的赋值运算符来忽略const
成员来使其合法且可编译,但不清楚这是否有意义。
将std::unique_ptr
存储到动态分配的对象,或重新考虑模型。
答案 1 :(得分: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而不是共享,我不确定您的要求是什么。如果您使用的是较旧的平台,则boost shared_ptr也可以使用)
答案 2 :(得分: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
}