【发布时间】:2015-09-03 08:40:23
【问题描述】:
为什么这段代码可以顺利编译?
class myvector
{
public:
myvector()
{
begin = new double[10];
end = begin+10;
}
~myvector()
{
delete[] begin;
}
double *begin;
double *end;
};
class VectorWorker
{
public:
VectorWorker(){}
void doWork(const myvector *v)
{
for (int i=0;i<10;i++)
v->begin[i] = i; // I don't want this to compile! I'd prefer compiler says me I can't modify v->begin
}
void doWork2(const myvector *const v) const
{
for (int i=0;i<10;i++)
v->begin[i] = i; // I don't want this to compile! I'd prefer compiler says me I can't modify v->begin
}
void doWork3(const myvector &v)
{
for (int i=0;i<10;i++)
v.begin[i] = i; // I don't want this to compile! I'd prefer compiler says me I can't modify v->begin
}
};
int main(int, char*[])
{
myvector x;
VectorWorker work;
work.doWork(&x);
work.doWork2(&x);
work.doWork3(x);
return 0;
}
我希望将const myvector *v 传递给VectorWorker::doWork 方法应该确保myvector 中的变量保持不变,但实际上它们已被修改。如何确定doWork方法允许只读操作?
实际上我无法将double *begin 和double *end 变量修改为const double *,因为它们来自第三方库。但是,即使通过const pointer,我如何确保它们在通过它们所属的类的实例时保持原样?
代码在 coliru 中可用:http://coliru.stacked-crooked.com/a/bb43fbebebdb5872
【问题讨论】:
-
修改
v.begin和修改v.begin指向的内容是完全不同的事情。通常的解决方案是,如果对象是const,则只公开一个不可修改的接口,但如果您无法控制myvector的定义,则您无能为力。 -
[OT]:你不尊重
myvector的 5 规则。
标签: c++ pointers compiler-errors constants