2014-05-11 7 views
1

이 있습니다. 나는 C++ #define 문에서 클래스 이름과 변수 이름 사이에 & 기호를 사용하는 것에 대해 혼란 스럽다.& 심볼의 C++ 전 처리기

globalhandling.hpp 파일에서 xbmc 소스 코드로 글로벌 싱글 톤을 만들었습니다.

필자는 비슷한 내용의 스 니펫을 작성하여 그 기능을 파악했습니다. 내가 실험 할 때 발견 한 것은 &이 하나의 생성자로만 사용되고 소멸자가 호출되었을 때입니다. 생략하면 하나의 생성자와 두 개의 소멸자가 호출됩니다.

&은이 상황에서 비트 및/또는 주소 연산자로 사용됩니까?

#include <iostream> 
#include <boost/shared_ptr.hpp> 

using namespace std; 

class aClass 
{ 
    public: 

    aClass() { cout << "Constructor\n"; } 


    aClass getInstance() { return *this; } 

    void printMessage() { cout << "Hello\n"; } 

    ~aClass() { cout << "Destructor\n"; } 
}; 

#define GLOBAL_REF(classname,variable) \ 
    static boost::shared_ptr<classname> variable##Ref(new classname) 

#define GLOBAL(classname,variable) \ 
    GLOBAL_REF(classname,variable); \ 
    static classname & variable = (*(variable##Ref.get())) 


GLOBAL(aClass,aVariable); 

int main() 
{ 
    aVariable.printMessage(); 

    return 0; 
} 
+10

이 보호 프로파일과는 아무 상관이 없습니다. 그것은 평범한 오래된 참조입니다. – chris

+1

참조를 만들고 있습니다. –

+0

왜'&'를 생략하면 두 소멸자가 호출됩니다. – user3625976

답변

2

당신이 언급하고있는 & 기호는 아마 이것이다 : 그것은 사실이다, 앰퍼샌드는 C 프리 프로세서와 아무 상관없는

static classname & variable = (*(variable##Ref.get())) 

하는 경우에는 C++ reference symbol .

일반적으로 포인터와 비슷한 이미 선언 된 객체를 가리키는 데 사용합니다. 예를 들어

:

int a = 1; 
int b = a; 
int &c = a; 

// a = 1, b = 1, c = 1. 

b = 2; 

// a = 1, b = 2, c = 1. 

a = 3; 

// a = 3, b = 2, c = 3. Note that variable 'c', which is a reference to 'a', has also changed. 

c = 4; 

// a = 4, b = 2, c = 4. 
+0

감사합니다! 당신은 많은 도움을주었습니다. – user3625976

+0

오브젝트를 참조하는 대신 오브젝트를 생략하고 복사하는 것을 발견했습니다. 나는 그것을 확인하기 위해 aClass에 복사 생성자를 추가했다. – user3625976