2011-01-08 10 views
2
#include<iostream> 
using namespace std; 

class aClass 
{ 
public: 
    char *message; 

    aClass(const char *message); 
    ~aClass(){delete[] message;} 
}; 

aClass::aClass(const char* newmessage) 
{ 
    message = new char[strlen(newmessage) +1]; 
    strcpy(message,newmessage); 
} 

const ostream& operator<<(const ostream& o, const aClass &a) 
{ 
    o << a.message; 
    return o; 
} 

int main() 
{ 
    aClass b("Hello"); 
    cout << b; 
} 

위의 코드가 무한 루프를 만드는 이유는 누구에게 설명 할 수 있습니까?오버로드시 오버플로 스택 오버플로 << 연산자

+1

왜 단지'표준 : string'를 사용하지 :

다음과 같이 작성해야 하는가? –

+0

[3 가지 규칙] (http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29)을 위반하고 있다는 점에 유의하십시오. 네가 수업을 복사하면 붐. 당신은 복사 생성자와 대입 연산자가 필요합니다. [copy-and-swap idiom] (http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom)을 사용하십시오. 단지'std :: vector '또는'std :: string'을 사용해야합니다. – GManNickG

답변

11

당신이 안 어디에 const을 가지고 있기 때문에 :

/////      ///// 
const ostream& operator<<(const ostream& o, const aClass &a) 

출력 스트림은 const가 아닌 것으로 생각됩니다; 결국 데이터를 출력하는 것이 바뀌고 있습니다. 그래서 당신은이 작업을 수행 할 때 하나는 const가 아닌 스트림에서 동작하기 때문에 그것은, char*의 정상 과부하를 사용할 수 없습니다

o << a.message; 

. 대신 적절한 과부하를 검색하여 자신을 찾은 다음 aClassa.message (생성자가 explicit이 아니기 때문에)에서 구성 할 수 있다고 결정하고이를 호출합니다. 이것은 영원히 반복됩니다.

ostream& operator<<(ostream& o, const aClass &a) 
{ 
    o << a.message; 
    return o; 
} 
+1

그리고 여러분이있는 동안 생성자를'explicit'으로 만드십시오. 또는 더 나은 아직 ** 단지'std :: string' **을 사용하십시오! –

+0

이와는 별도로 클래스는 허약합니다 (개인 복사 생성자 및 할당 연산자가 없으며 비효율적입니다 (strlen의 결과는 지역에 저장되어야하고 memcpy는 strcpy에서 사용해야합니다). – Achille