2016-11-21 13 views
1

아래 코드는 기본적으로 클래스 생성자를 private로 설정하고 하나의 정적 공용 함수를 제공하여 클래스를 생성하는 싱글 톤 클래스의 예제입니다. 필요한 경우 클래스의 인스턴스.정적 함수가 클래스의 private 멤버 함수 (생성자)에 액세스하는 방법

제 질문은 new 연산자를 사용하여 static 함수 내에 싱글 톤 클래스의 객체를 생성 할 때 클래스의 생성자가 반드시 호출됩니다. 정적 함수는 정적 멤버와 클래스의 정적 함수에만 액세스 할 수 있기 때문에 어떻게되는지 혼란 스럽습니다. 그렇다면 어떻게하면 클래스의 private 함수 (생성자)에 액세스 할 수 있습니까?

정적 함수는 인스턴스를 만들지 않고 클래스의 private 또는 public 멤버 함수를 호출 할 수 있습니까? 나는 아래 샘플 코드를 쓸 때

#include <iostream> 

using namespace std; 

class Singleton 
{ 
public: 
    static Singleton *getInstance(); 

private: 
    Singleton(){} 
    static Singleton* instance; 
}; 

Singleton* Singleton::instance = 0; 
Singleton* Singleton::getInstance() 
{ 
    if(!instance) { 
     instance = new Singleton(); //private ctor will be called 
     cout << "getInstance(): First instance\n"; 
     return instance; 
    } 
    else { 
     cout << "getInstance(): previous instance\n"; 
     return instance; 
    } 
} 

int main() 
{ 
    Singleton *s1 = Singleton::getInstance(); 
    Singleton *s2 = Singleton::getInstance(); 
    return 0; 
} 

는 그러나 우리가 정적 대중과 클래스의 민간 기능에 액세스 할 수 있으면

file.cpp: In static member function ‘static void Sample::statFunc()’: 
file.cpp:61: error: cannot call member function ‘void Sample::testFunc()’ without object. 

:

class Sample 
{ 
    private: 
     void testFunc() 
     { 
      std::cout << "Inside private function" <<std::endl; 
     } 
    public: 
     static void statFunc() 
     { 
      std::cout << "Inside static function" <<std::endl; 
      testFunc(); 
     } 
}; 

int main() 
{ 
    Sample::statFunc(); 

    return 0; 
} 

을 나는 ++ g와 컴파일 오류 기능을 누른 다음 왜이 오류가 발생합니까?

+0

짧은 답변 : IMHO 예. 그리고 IMHO 코드에는 아무런 문제가 없습니다. 'getInstance'는'Singleton' 클래스의 멤버입니다. 따라서 클래스의 모든 메소드를 호출 할 수 있습니다. 심지어 private 메소드도 호출 할 수 있습니다. –

답변

0

위의 코드가 작동하는 이유는 getInstance() 구현이 개체의 인스턴스를 요청하지 않는 생성자를 호출하기 때문입니다.

정적 멤버 함수는 개체가 아닌 클래스에 속합니다.따라서 정적 멤버 함수를 호출 할 때 객체의 인스턴스가 없으므로 포인터가 없기 때문에 this 포인터에 액세스 할 수 없습니다. 정적 함수에서 비 정적 개인 멤버 함수에 액세스하려면 개체 참조를 함수에 전달해야합니다. 예 :

class foo { 
    public: 
      foo(int i) : myInt(i) {} 
      static int myStaticMethod(foo & obj); 
    private: 
      int myInt; 
    }; 

    int foo::myStaticMethod(foo & obj) { 
      return obj.myInt; 
    } 

#include <iostream> 


int main() { 
foo f(1); 
std::cout << foo::myStaticMethod(f); 
return 0; 
}; 
+0

답변 해 주셔서 감사합니다. 그래서 위에서 내가 이해 한 것은 ctor가 어떤 객체도 필요없는 정적 멤버 함수를 사용하여 호출 할 수있는 객체를 호출 할 필요가없는 특별한 멤버 함수이지만 클래스의 다른 일반 멤버 함수는 객체를 호출하지 않고 정적 함수 내에서 호출 할 수 없도록 호출해야합니다. – Viki

+0

예. – TomJ

1

static 함수는 인스턴스를 만들지 않고 클래스의 private 또는 public 멤버 함수를 호출 할 수 있습니까?

입니다.

instance = new Singleton(); 

new 키워드는 Singleton 개체를 만듭니다.

Singleton::getInstance은 클래스의 멤버 함수이기 때문에 static인지 여부에 관계없이 생성자를 호출 할 수 있습니다 (단, 간접적으로 만 수행합니다). 나중에 추가 한 질문의 두 번째 부분에 대한

0

답 : testFunc (개인 또는되지 않음) 인스턴스 기능 때문에

class Sample 
{ 
private: 
    void testFunc() 
    { 
    std::cout << "Inside private function" << std::endl; 
    } 
public: 
    static void statFunc() 
    { 
    std::cout << "Inside static function" << std::endl; 

    Sample s; 
    s.testFunc();   // this is OK, there is an object (s) and we call 
          // testFunc upon s 

    // testFunc();   // this is not OK, there is no object 
    } 
    void InstanceFunction() 
    { 
    std::cout << "Inside public instance function" << std::endl; 
    testFunc(); 
    } 
}; 


int main() 
{ 
    Sample s; 
    s.InstanceFunction(); 

    Sample::statFunc(); 
    return 0; 
} 

statFunc 내부에서 testFunc(); 호출은 할 수 없습니다, 당신은 Sample 필요 testFunc이 조작 할 수있는 대상이 statFunc 인 경우 static 기능이므로 Sample 개체가 없습니다.

오류 메시지는 매우 분명합니다.

testFuncstatFunc에서 객체를 제공하는 경우에만 호출 할 수 있습니다 (위 코드 참조).

+0

내가 생각하는 것과 비슷한 방식으로 싱글 톤 클래스의 생성자는 클래스 함수이며 정적 함수에 의해 호출되지 않아야한다. construtor가 정적 함수 내부에서 호출 될 수 있다면 왜 일반 개인 함수가 나 혼란 스러울 까? – Viki

+0

@Vikram은 생성자가 정상적인 멤버 함수가 아님을 기억하십시오. 당신이'instance = new Singleton();을 쓸 때, 당신은 객체를 생성하고 생성자는 생성되는 객체에 대해 호출됩니다. –

+0

@Vikram, 나는 대답을 편집했다. 이제'statFunc'에서'testFunc'를 호출 할 수있는 예제가있다. –