我有以下类结构:
class A {
void constMethod() const();
void nonConstMethod();
};
class Base {
public:
A const* getA() const;
void methodThatModifiesBase();
protected:
A* getA();
private:
A* a;
};
class Derived: public Base {
void methodThatModifiesA();
};
所以类Base
包含A
并提供一个公共访问器,它不允许修改对象。 Derived
有一个方法需要访问A并需要修改它。它可以通过非const
访问器来实现。
当我尝试修改此代码时,我的问题就出现了。
void functionThatModifiesBase(std::shared_ptr<Base> b);
void problemFunction(std::shared_ptr<Base> b)
{
b->methodThatModifiesBase();
if (b->getA())
{
b->getA()->constMethod();
}
}
由于b不是const
,编译器会尝试使用非const
getA()
,因为它受到保护而失败。它不会尝试使用会成功的公众const
getA()
。
我无法将b
的类型更改为std::shared_ptr<const Base>
,因为我也在其上调用非const方法。
似乎可能的解决方案是添加
std:shared_ptr<const Base> const_b{b};
并在需要时使用它,或重命名其中一个getA
方法,例如,protected: A* getAProtected()
。
这两种看起来都很笨拙。有没有更好的方法来处理这个问题?
答案 0 :(得分:1)
根据我评论中的链接。在检查访问说明符之前进行重载解析。
你的函数正在处理一个非const的Base指针(通过共享指针)所以很自然地寻求与非const版本的getA绑定。
这是受保护的,因此您会收到编译错误。