【发布时间】:2016-07-05 12:41:48
【问题描述】:
考虑一下:
struct Foo {
std::vector<double> x;
mutable double* xp;
void foo () const { xp = &(x[0]); }
};
这不会编译,因为
error: invalid conversion from 'const double*' to 'double*' [-fpermissive]
修复相当简单:
struct Foo {
mutable std::vector<double> x;
mutable double* xp;
void foo () const { xp = &(x[0]); }
};
但是如果我不想让向量可变怎么办?在这种情况下,从 const 向量获取指向非 const 的指针的最佳方法是什么?
我要解决的问题如下:
我有一些看起来像这样的代码(抱歉不能发布完整的代码):
struct Foo {
mutable DataSource data;
void load(int index) const { data->GetEntry(index); }
void getX() const { return data->element->x; }
};
我无法更改DataSource 的位置,它的GetEntry 从文件中读取以更新其element。以这种方式读取文件比较慢,因此我想将其更改为
struct Foo {
mutable DataSource data;
std::vector<DataSource::Element> elements;
DataSource::Element* current;
void loadAll() { /*... read all elements into the vector ...*/ }
void load(int index) const { current = &(elements[index]); }
void getX() const { return current->x; }
};
因为我可以在不破坏(大量)现有代码的情况下做到这一点。我可以完全放弃 constness,这可能是一个更好的设计,但如果可能的话,我想避免这种情况,因为那样我必须在其他地方解决问题。
【问题讨论】:
-
为什么你想要一个指向非
const的指针?真正的问题是什么? -
没有“最好的方法”。这个looks like an XY problem。您要解决的真正问题是什么。不,不是这里要问的问题,而是您认为其解决方案涉及可变类成员的问题,而您要问的是。
-
请记住,如果您从不修改 *xp 或对 *xp 进行非 const 引用,您也可以拥有一个指向 const 对象的可变指针,即
mutable const double *xp; void foo() const { xp = &x[0]; }是完全有效的。 -
为什么
load()首先被声明为const函数,而它的唯一目的显然是改变对象的状态? -
可能@majk 的评论是您正在寻找的解决方案。我会注意到
void getX() const { return current->x; }不会编译。所以这些都不是真正的代码,当你发布一个只对问题进行模糊描述的问题时,获得最佳答案的机会很渺茫。
标签: c++ vector constants mutable