gpt4 book ai didi

c++ - 在分配对象时保持常量

转载 作者:行者123 更新时间:2023-11-28 00:35:56 25 4
gpt4 key购买 nike

赋值时是否可以保留对象的常量性?考虑一个类持有指向动态内存的指针,在赋值时需要一个软拷贝。 (还有一些更复杂的逻辑,包括引用计数,但与问题无关)。

class Vec {
private:
int *data_; // dynamic array
public:
int * Data() { return data_;} // access for modification
const int * Data() const { return data_;} // read only access
Vec subVec(int pos) { // create writable submat
Vec ret;
ret.data_ = &data_[pos];
return ret;
}
const Vec subVec(int pos) const { // create read only submat
Vec ret;
ret.data_ = &data_[pos];
return ret;
}
};
void processVec(const Vec & src) {
src.Data()[0] = 1; // not allowed, since src const
Vec subVec = src.subVec(2); // call const version of subVec and create
// a soft copy - wrapper for a part of array.
// Assignment creates a copy, which removes constness
subVec.Data()[0] = 1; // allowed! Since subVec is a copy, but modifies
// identical dynamic memory from the wrapped src!
}

我希望 subVec.Data()[0] = 1; 失败,因为它应该保持常量。

最佳答案

你的问题是,你正在定义一个指向某个对象的智能指针,但是你混淆了智能指针的常量(类似于 Foo* const bar;)和对象的常量(类似于 const Foo* bar;)。您需要的是将指针的常量与对象的常量分开。

你可以通过使用两个智能指针类而不是一个来相对容易地做到这一点:一个基类,它为一个 const 对象实现智能指针,一个派生类为一个非 const 对象。

有了它,你总是可以将你的智能指针降级到“const”基类,制作免费的“const”拷贝等。你甚至可以向派生的非“const”智能指针类添加一个构造函数,它采用“const”基类的智能指针来制作数据的深拷贝。

关于c++ - 在分配对象时保持常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20959944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com