【问题标题】:Accessing private member using this pointer returned by shared_from_this使用 shared_from_this 返回的 this 指针访问私有成员
【发布时间】:2017-01-19 23:29:03
【问题描述】:

我有一个如下所示的实现:

class A : public std::enable_shared_from_this<A>
{
public:
    A() {}
    void dummy(std::string name);

private:
    std::map<std::string, std::string> cache;
};

void
A::dummy(std::string name) {
    auto shared_this = shared_from_this();
    auto find =
        [name, shared_this] () {
            auto iter = shared_this->cache.find(name);
    };
}

我不确定这条线是如何工作的: auto iter = shared_this->cache.find(name);

看起来我们正在尝试使用指向类的指针来访问私有成员,但我不确定它是否会有所不同。

这是如何工作的?

【问题讨论】:

  • 这没问题。由于dummy()A 类的成员,它可以访问A 的任何实例的任何私有成员。

标签: c++ memory-management this shared-ptr


【解决方案1】:

A::dummy(std::string name)A 类的成员。因此,在此函数中,您可以访问A 的任何实例的所有publicprotectedprivate 成员。以下是标准中的相关引述:

N4140 §11 [class.access]/1

类的成员可以是:

(1.1) — 私人;也就是说,它的名字只能被声明它的类的成员和朋友使用。

(1.2) — 受保护;也就是说,它的名字只能被它所在班级的成员和朋友使用 由从该类派生的类和它们的朋友声明(见 11.4)。

(1.3) — 公开的;也就是说,它的名字可以在任何地方使用,没有访问限制。

N4140 §11 [class.access]/2

类的成员还可以访问该类可以访问的所有名称。成员函数的本地类可以访问成员函数本身可以访问的相同名称。 p>

【讨论】:

    【解决方案2】:

    看起来我们正在尝试使用指向类的指针来访问私有成员,但我不确定它是否会有所不同。

    是的,这是正确的。由于dummy()A 的成员,它可以访问A 的所有成员,包括私有成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多