2016-10-17 9 views
3

私はCPPクイズで質問を見つけました。問題はC++でプライベートネストされたクラスにアクセスするには?

class secret 
{ 
    class hidden{}; 
public: 
    template <class K> 
    string accept(K k) {return (k(*this, hidden()));} 
    string keyToNextLvl (hidden)const {return ("success!"); } 
}; 

struct SampleSoln 
{ 
    template <class pwd> 
    string operator()(const secret &sc, pwd opwd) const 
    { return (sc.keyToNextLvl(opwd)); } 
}; 
int main() 
{ 
    secret sc; 
    cout <<sc.accept(SampleSoln()) << endl; //Prints success 
    cout <<sc.keyToNextLvl (AnswerKey()) << endl; //Need to provide the implementation of AnswerKey 
} 

です。これで、メソッド "keyToNextLvl"を直接使用してアクセスする必要があります。 (私はacceptメソッドにアクセスすることは許されていません - サンプルソリューションは、acceptメソッドを使用してkeyToNextLvlにアクセスするために提供されています)。友人を使わずにプライベートメンバー/メソッドにアクセスする http://bloglitb.blogspot.in/2010/07/access-to-private-members-thats-easy.html

しかし、私は上記の解決策については何も考えていませんでした。一例として、

sc.keyToNextLvl ({}) 

:それについては

答えて

5

struct AnswerKey 
{ 
    template <class T> 
    operator T() 
    { 
    return T(); 
    } 
}; 

それでは、どのようにそれをkeyToNextLvl` `呼ぶのですsecret::hiddenオブジェクト

+0

を構築するテンプレート変換演算子を使用していますか? –

+0

質問にある通りそのまま – vu1p3n0x

+0

ああ、今すぐ手に入れます。最初は 'operator()'をオーバーロードしたと思っていましたが、変換演算子であることが分かりました( 'T operator()'と 'operator T()'の小さな違い)。ニート! –

3

がデフォルト構築可能である、あなたがこれを行うことができます

#include<string> 
#include<iostream> 

class secret 
{ 
    class hidden{}; 
public: 
    template <class K> 
    std::string accept(K k) {return (k(*this, hidden()));} 
    std::string keyToNextLvl (hidden)const {return ("success!"); } 
}; 

int main() 
{ 
    secret sc; 
    std::cout <<sc.keyToNextLvl ({}) << std::endl; 
} 

をあなたはAnswerKeyを定義する必要はありません。
クラスの名前はですが、実際にその名前を使用する必要がない限り作成できます。

関連する問題