【发布时间】:2013-06-09 05:22:34
【问题描述】:
我遗漏了一些东西,或者 const-correctness 与指针(或者可能是智能指针,因为这是我测试过的?)的预期效果不太一样。无论如何,这是我在尝试 PIMPL 习语的变体时观察到的。
我声明了以下内容:
class A {
public:
A(...);
...
bool update_stuff(...) const;
...
protected:
bool update_stuff_impl(...) const;
...
private:
struct pimpl;
pimpl* m_pimpl;
};
对于实施,我有类似的东西:
struct A::pimpl {
pimpl(...): some_data(new some_type());
...
some_method1(...); // Modifies content of some_data
some_method2(...); // Modifies content of some_data
...
boost::shared_ptr<some_type> some_data;
};
A::A(...): m_pimpl(new pimpl(...)) {
...
}
bool A::update_stuff(...) const {
if( !update_stuff_impl(...) ) {
return false;
}
return true;
}
bool A::update_stuff_impl(...) const {
//-Change content of pimpl::some_data here
m_pimpl->some_method1(...);
m_pimpl->some_method2(...);
return true;
}
我无法理解的是,当我实际修改 A::pimpl::some_data 时,我如何能够摆脱对函数 A::update_stuff(...) 和 A::update_stuff_impl(...) 使用 const 限定符??!或者这是预期的行为还是只是简单的错误使用?如果是后者之一,如果您能确定如何纠正它,请不胜感激?
感谢您的时间和兴趣。
【问题讨论】:
-
由于您没有更改任何类成员,因此 const 正确性仍然存在,例如在 update_stuff_impl 中,您不会将指针 m_pimpl 更改为指向其他内容!
-
好的..就这样?我也是这么想的,但出于某种原因,我认为 const-correctness 检查的不止这些。我想它只检查指针而不是它的内容是有道理的,因为这可能是另一个指针,它可能指向另一个指针......等等,这将是太多的强制执行。嗯,这清除了它。如果你喜欢,你可以把它写成答案,我会选择它。谢谢。
标签: c++ const-correctness pimpl-idiom