2016-10-17 5 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에 액세스하는 샘플 자체 솔루션이 제공됩니다. AnswerKey의 구현을 제공해야합니다.

일부 검색을 수행하고 몇 가지 방법이 있습니다. 친구를 사용하지 않고 비공개 멤버/방법에 액세스하십시오. http://bloglitb.blogspot.in/2010/07/access-to-private-members-thats-easy.html

하지만 위의 해결 방법에 대한 아이디어는 얻지 못했습니다. 이 기본 작도가 들어

답변

5

알 수 있습니다.

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

은 당신이 그것으로`keyToNextLvl`를 호출 어떻게 그래서 secret::hidden 객체

+0

를 구성하는 템플릿 변환 연산자를 사용? –

+0

질문에있는 그대로 정확히 – vu1p3n0x

+0

아, 이제 알겠습니다. 처음에 나는 당신이'operator()'를 오버로드 시켰다고 생각했지만, 이제는 변환 연산자 ('T operator()'와'operator T()'사이의 작은 차이)를 볼 수 있습니다. 산뜻한! –

3

, 당신은이 작업을 수행 할 수 있습니다

sc.keyToNextLvl ({}) 

를 예를 들어 : AnswerKey을 정의하는 데 필요하지 않은

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

.
보이지 않는 것은 클래스의 이름이이지만 실제로 이름을 사용할 필요가없는 한 만들 수 있습니다.