2012-09-26 3 views
0

첫 번째로 객체를 반환하고 두 번째로 myclass의 값이 저장되는 주소를 반환하는 명백한 방법 이외의 다른 방법이 있습니까? 많은 소스에서 Aeonsoft와 같은 대기업의 경우에도 첫 번째 방법을 거의 볼 수 없어서 방법 2가 사용되는 것을 보았 기 때문에 묻습니다. 그러나 일부 프로그래머는 &return을 좋아하지 않으므로 이에 대해 나에게 알려주십시오.싱글 톤 방법의 차이

static myclass& getinstance() 
{ 
    static myclass a; 
    return a; 
} 

static myclass* getinstance() 
{ 
    static myclass a; 
    return &a; 
} 

편집 아 얘들 아, 내가

그것은 스타일의 문제의 첫 번째 방법은 첫 번째 방법을 수정 한 이후 지금

+5

편집에 관해서, 왜이 컨텍스트에서 포인터를 사용하는지 이해할 수 없습니다. 참조가 더 명확합니다. 단지'myclass'가 복사 불가능하다는 것을 확인하십시오. –

+0

네, 다른 사람들과 같은 의견이 있습니다. 제가 이해하지 못하는 이유는 제가 말했듯이 두 번째 방법이 너무 많이 사용 되었기 때문입니다. 대기업 출처에서도 어쩌면 제가 최근 코드를 충분히 보지 못했을 수도 있습니다. ? –

답변

4

첫 번째는 이해되지 않는다. 후자는 포인터가 필요 없기 때문에 약간 바보입니다. 포인터가 아닌 참조를 반환하는 개체가 존재하는 것을 나타냅니다 없기 때문에 (

static Foo & getFoo() 
{ 
    static Foo impl; 
    return impl; 
} 
+0

'&'을 잊어 버렸습니다. 질문을 다시 생각해주십시오. –

1

...에 & 나쁜 잊었 내 어느 쪽이 바람직 할까? C로 시작하여 나중에 C++로 옮긴 사람은 참조를 사용하지 않고 자연스럽게 포인터를 사용할 수 있습니다.


첫 번째 메서드는 개체의 복사본을 반환하기 때문에 실제로는 단일 개체를 만들지 않습니다.

하나의 간단한 미묘한 변화는 그 문제를 해결 할 수 : 그것은 를 복사 반환하기 때문에

static myclass & getinstance() 
{ 
    static myclass a; 
    return a; 
} 
+0

그냥'&'라고 쓰고 깜박했다. 질문을 수정했다. –

+1

나는 그것이 순전히 스타일의 문제라는 것에 동의하지 않는다. 참조와 포인터는 다른 의미론을 가지고 있으며, 그것은 단순한 임의적 선호가 될 수 없다. 포인터는 여기서 의도 한 의미를 가지지 않으므로 참조가 더 좋습니다. 당신은 하나를 가리 키지 않는 객체를 가리키고있다. (포인터는 널 입력이 가능하다.) – GManNickG

+0

@GManNickG, 포인터와 참조 모두 작업을 완료 할 수 있으며 의미 차이를 신경 쓰지 않아도됩니다. 나는 참조가 보통 더 잘 맞는다는데 동의하지만, 포인터는 더 많은 유연성을 줄 수있다. 'getinstance' 메서드를 사용하여 테스트 객체를 삽입 할 수 있습니다. 또한 라이브러리와 DLL을 혼합하면 하나 이상의 싱글 톤이 생성되어 포인터 테이블을 필요로하는 문제가 발생합니다. –

2

첫 번째 API는 더 나은 즉 :

싱글 생성 기능에 대한 일반적인 방법은 참조을 반환하는 것입니다 NULL을 테스트해야 함). 두 가지 방법을 모두 사용하면 다형성 객체 (즉, myclass의 하위 클래스)를 반환 할 수 있으므로 차이가 없습니다. 가능한 경우 참조를 반환하는 것이 좋습니다.

+1

누가 포인터를 좋아하니? –

1

첫 번째 경우 a 개체의 복사본을 반환합니다. 두 번째에서는 포인터를 반환합니다. 첫 번째 함수는 싱글 톤을 멀티 -ton으로 바꿉니다.

또한 포인터 대신 참조를 반환하는 두 번째 수정합니다.

static myclass& getinstance() 
{ 
    static myclass a; 
    return a; 
} 

수정 한 후 복사본 대신 첫 번째 함수에서 정적 개체에 대한 참조를 반환하는 것처럼 보입니다. 이 경우 함수 호출자가 두 번째 경우에 포인터를 역 참조 할 필요가 있다는 점을 제외하고는 차이점이 없습니다.

입력/반환 값 nullptr을 처리 할 수 ​​있어야한다는 것을 제외하고는 경험적으로 항상 허용/반품 참조를 허용합니다.

1

참조로 돌아 가기.

개체를 소유 한 사람이 혼동하지 않기 때문입니다. 포인터로 돌아 오면 소유권 의미가 명확하지 않기 때문에 사용자가 포인터를 삭제해야한다고 잘못 생각할 수 있습니다.