gpt4 book ai didi

c++ - 具有不同保护级别的访问器

转载 作者:行者123 更新时间:2023-11-28 06:31:12 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





C++ Protected / Public overloads

(4 个回答)


7年前关闭。




我有以下类结构:

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并为其提供一个公共(public)访问器,该访问器不允许修改对象。 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() , 因为它受到保护而失败。它不尝试使用公共(public), const getA() ,这将成功。

我无法更改 b 的类型至 std::shared_ptr<const Base> ,因为我也在上面调用非常量方法。

似乎可能的解决方案是添加
std:shared_ptr<const Base> const_b{b};

并在需要时使用它,或重命名 getA 之一方法,例如 protected: A* getAProtected() .

这两个似乎有点笨拙。有没有更好的方法来处理这个问题?

最佳答案

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

您的函数正在处理非常量基指针(通过共享指针),因此自然会寻求与 getA 的非常量版本绑定(bind)。

这是 protected ,因此您会收到编译器错误。

C++ Protected / Public overloads

关于c++ - 具有不同保护级别的访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27530083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com