2017-11-23 12 views
-1

이 튜토리얼을 따라 내 싱글 톤을 만들었습니다 (내 클래스 이름은 King입니다) : https://sourcemaking.com/design_patterns/singleton/cpp/2; 당신이 볼 수 있듯이연산자 <<를 싱글 톤으로 인해 수행 할 수 없습니다

#include "King.h" 

King *King::k = 0; 
King *King::instance(){ 
    if(!k){ 
     k = new King(); 
     //the king is green 
     k->setTeam(0); 
    } 
    return k; 
} 
//Printing the king 
namespace std{ 
    ostream& operator<<(ostream& out, const King& k){ 
     out << "\033[32m" << "K" << "\033[0m"; 
     return out; 
    } 
} 

, 내 문제는 내가 < < 연산자를 오버로드 할 것입니다 :

King.h :

#include "Generic_Piece.h" 

class King : public Generic_Piece { 
public: 
    //public static accessor function 
    static King *instance(); 


protected: 
    //singleton : define all constructors to be protected 
    King(){} 

private: 
    static King *k; 

}; 

//Print the king in green colour 
namespace std{ 
    ostream& operator<<(ostream& out, const King& k); 
} 

King.cpp 그래서 여기 내 코드입니다 초록색 K 인쇄하기 : 나는 주된 색깔처럼 그것을 부른다. std :: cout < < King :: instance() < < std :: endl; 그러나 주소 0x55d7a133f280을 출력합니다. 문제는 싱글 톤을 사용하는 것입니다. 나는 King :: print() 함수로 인쇄 할 수 있다고 생각하지만 실제로는 < < 연산자를 오버로드하는 것을 선호합니다. 너는 어떤 생각을 가지고 있니?

+1

포인터를 역 참조해야하는 객체를 인쇄하려면'King :: instance'가 포인터를 반환합니다. 실제로는 싱글 톤과 아무런 관련이 없습니다. – user463035818

+2

싱글 톤은 * anti * -pattern이고 대부분 glorified 전역 변수입니다 . 당신에게 많은 슬픔과 고통을 줄 가능성이 있습니다. 그냥 제 충고가되지 않도록하십시오. –

답변

2

King::instance은 포인터를 반환합니다. void* 걸리는 일 - 따라서, 때 당신은 operator <<의 다른 오버로드를 호출

std::cout << King::instance() << std::endl; 

물품. 이제 operator <<의 원래 호출이 올바른 결과를 얻을 것이다

King& King::instance(){ 
    if(!k){ 
     k = new King(); 
     //the king is green 
     k->setTeam(0); 
    } 
    return *k; 
} 

:

std::cout << *King::instance() << std::endl; 

더 좋은 King::instance() 반환 King에 대한 참조를 만들 : 당신의 연산자를 사용하여 인스턴스를 인쇄하기 위해, derererence를 추가 .

+0

나는 그것이 아주 명백했다라고 생각할 수 없다. 나는 코드의 다른 부분에 너무 집중했다. 그래서 나는 당황했다. 답변 해 주셔서 감사합니다. – Marie