具有不同保护级别的存取器

时间:2014-12-17 16:20:58

标签: c++ c++11 protection

我有以下类结构:

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()

这两种看起来都很笨拙。有没有更好的方法来处理这个问题?

1 个答案:

答案 0 :(得分:1)

根据我评论中的链接。在检查访问说明符之前进行重载解析。

你的函数正在处理一个非const的Base指针(通过共享指针)所以很自然地寻求与非const版本的getA绑定。

这是受保护的,因此您会收到编译错误。

C++ Protected / Public overloads