我遗漏了一些东西,或者 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;
}
我难以理解的是如何摆脱const
对函数使用限定符A::update_stuff(...)
以及A::update_stuff_impl(...)
何时实际修改A::pimpl::some_data
??!或者这是预期的行为还是只是简单的错误使用?如果是后者之一,如果您能确定如何纠正它,请欣赏?
感谢您的时间和兴趣。