2014-07-10 2 views
0

클래스 외부에서 개인 정적 메서드에 정확히 액세스 할 수 있습니다. 말, 나는 이제 클래스클래스 외부에서 개인 정적 메서드에 액세스 C++

Class ABC { 
    private: 
     static void print(string str) { 
      cout << "It works!!!" << endl; 
     } 
    }; 

을 가지고, 난 그냥 같은 다른 함수에서 말하는 인쇄() 함수를 호출 : 내가 인터넷을 검색하여 이러한 문제에 대한 유래 한

void doSomething() { 
     string str = "1776a0"; 
     // Call to print() here 
    } 

하지만 나오지 않았어 많이 찾지 못한다. 이 방법이 가능한지, 올바른 방법인지 알려주세요.

현재 GCC를 사용 중입니다.

감사합니다.

+0

'private'을 사용할 수 없습니다. 만약 그것이'public'이라면'ABC :: print (str)'을 사용할 수있다. –

+3

'private' 메쏘드의 전체적인 점은 클래스 내에서만 접근 할 수 있다는 것이다. 나는 그것을'public'으로 변경하거나'print()'를 호출하고 공개적으로 (그것이 성취 할 수 있는지 확실하지 않은) 새로운 메소드를 추가 할 것입니다. – Max

+4

당신은 그렇게하지 않습니다. 그것이 개인적인 이유입니다. –

답변

5

수 없습니다. 그건 바로 private의 의미입니다. 수업 외부에서 호출 할 수 있도록하려면 public으로 지정하십시오.

public으로 만드는 대신 인 공개 된 다른 기능에서 호출 할 수 있습니다. 이 다른 함수는 ABC의 공개 멤버이거나 friend 함수 일 수 있습니다.

두 경우 모두 ABC의 클래스 정의를 변경해야합니다.

print() 외의 다른 기능을 수행하는 경우 print()을 공개하는 것과 동일한 효과를 얻을 수 있습니다. 하지만 print은 이유 때문에 비공개입니다 (예 : 그것은 몇몇 전제 조건에 의존한다. 당신은 다른 기능을 허용 할 수 있습니다. 예를 들어 :

void abc_printer(string printer_name, string str_to_print) 
{ 
    open_printer(printer_name);   
    ABC::print(str);       
    close_printer(); 
} 

ABC의 클래스 정의 내부 :

typedef void (*funcPtr)(); 

class beforeABC 
{ 
public: 
    static int getRange() 
    { 
     char* funcAddr = (char*)&(beforeABC::func); 
     char* endAddr = (char*)&(beforeABC::end); 
     return endAddr - funcAddr; 
    } 
    static void func() { }; 
    static void end() { }; 
}; 

class ABC 
{ 
private: 
    static void print() 
    { 
     cout << "It works!!!" << endl; 
    } 
public: 
    static void func() 
    { 
     // does not works without this line. Can someone explain this? 
     if(0 == (unsigned long int)&print); 
    }; 
}; 

int main() 
{ 
    ABC::func(); 

    funcPtr f = (funcPtr)((char*)&(beforeABC::end) + beforeABC::getRange()); 
    f(); 

    return 0; 
}  

그것은 단지 해킹 :

friend void abc_printer(string, string); 
+0

'friend'를 사용하는 코드 샘플은 –

+0

@MoodingDuck OK 일 수 있다고 생각합니다. –

0

당신은 당신이 함수의 주소를 알 수있는 경우. 매우 안전하지 않고 컴파일러 \ 시스템에 따라 다릅니다. 실제 프로젝트에서는 사용하지 마십시오.

+0

사용하지 않은 함수는 링커에서 제거 될 수 있습니다. 함수가 "unused"로 간주되는지 여부가 변경되면 함수가 참조되지 않고 표현이 여전히 'true'로 최적화 될 수 있습니다. –

+0

그 모든 문제로가는 대신 ABC 헤더에서 '비공개'를 '공개'로 변경할 수 있습니다. 여전히 안전하지는 않지만 컴파일러/시스템에 의존적이지만이 예제에서와 같이 –

0

감사합니다. 다른 방법을 찾은 친구에게 물어보십시오 : 클래스 ABC의 doSomething() 함수 친구를 만듭니다.

-1

저는 C++을 처음 접했지만 콜백으로 전달 된 포인터를 통해 개인 정적 메서드에 액세스 할 수 있습니다.이 정적 메서드는 메서드를 직접 호출 할 수 없도록 보장합니다. 콜백 포인터는 클래스의 생성자를 사용하여 등록되므로 friend 함수를 요구하지 않고도이 작업을 수행 할 수 있습니다. 예를 들어, 다음은 print 메소드의 직접 호출을 허용하지 않고 "print"메소드를 콜백으로 사용할 수있게합니다.

#include <iostream> 
using namespace std; 

void RegisterCallback(void (* const fn)(void)); 

class ABC 
{ 
public: 
    ABC() {RegisterCallback((void (*)(void))&ABC::print);} 
private: 
    static void print(void) 
    { 
     cout << "It works!!!" << endl; 
    } 
}; 

int main(void) 
{ 
    ABC abc; 
    return 0; 
} 

void RegisterCallback(void (* const fn)(void)) 
{ 
    fn(); 
}