2017-01-19 8 views
0

によって返されたこのポインタを使用してプライベートメンバへのアクセス、私はこのようになります実装があります。shared_from_this

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); 
    }; 
} 

を、私はこの行がどのように動作するかわからない: 自動ITER = shared_this-> cache.find(名) ;

クラスへのポインタを使用してプライベートメンバーにアクセスしようとしているようですが、動作が異なるかどうかはわかりません。

これはどのように機能しますか?

+0

これは問題ありません。 'dummy()'はクラス 'A'のメンバであるため、' A'のインスタンスのプライベートメンバにアクセスすることができます。 – Mike

答えて

2

A::dummy(std::string name)は、クラスAのメンバーです。したがって、この機能の中から、Aのすべてのインスタンスについて、すべてpublicprotected、およびメンバーにアクセスできます。

N4140§11[class.access]/1

クラスのメンバーであることができる:ここで標準から関連引用符は

(1.1) - プライベート。つまり、その名前はメンバーと宣言されているクラスの友人のみが使用できます。

(1.2) - 保護;つまり、その名前は、 が宣言されているクラスのメンバーや友人、そのクラスから派生したクラス、およびその友人によってのみ使用できます(11.4を参照)。

(1.3) - public;つまり、その名前はアクセス制限なしでどこでも使用できます。

N4140§11[class.access]/2

クラスのメンバーは、クラスがアクセスを持っているために、すべての名前をもアクセスすることができます。メンバ関数のローカルクラスは、メンバ関数自体がアクセスできる同じ名前にアクセスできます。

0

私たちはプライベートメンバーにクラスへのポインタを使ってアクセスしようとしているようですが、別の方法で動作するかどうかはわかりません。

はい正しいです。 dummy()Aのメンバーであるため、Aのすべてのメンバー(非公開のメンバーを含む)にアクセスできます。