2013-06-12 4 views
0

난 내 자신의 문자열 클래스를 만들고있어 모든 것이 하나이를 제외하고 잘 작동 : 나는이 할 수 있도록 operator += 연산자를 오버로드하기 위해 노력하고있어 :이 + = 연산자를 어떻게 작동시킬 수 있습니까?

string s1 = "Hello", s2 = " World"; 

s1 += s2; 

것은 그래서 내가 뭘하려 :

// In the string class, 

string& operator +=(string const& other) 
{ 
    using std::strcpy; 

    unsigned length = size() + other.size() + 1; // this->size() member 
    char *temp = new char[length];    // function and a "+ 1" for the 
               // null byte '\0' 
    strcpy(temp, buffer); 
    strcpy(temp, other.data()); 

    delete[] buffer; 

    buffer = new char[length]; 
    strcpy(buffer, temp);  // copy temp into buffer 

    return *this; 
} 

그러나 my program 위의 주 코드를 사용할 때 출력 후에 출력이 없습니다. 또한 오류가 발생하지 않습니다 (런타임 오류조차도 없음). 왜 그런가요? 어떻게 구현할 수 있습니까?

참고 : std::string을 사용할 수 있지만이 방법을 직접 배우고 싶습니다.

strcpy(temp, other.data()); 

당신은 이미 (이전 행에서) 버퍼에 첫 번째 문자열을 복사 한, 그러나 이것은 다음 은 다른 문자열의 데이터로을 덮어 :

+5

사람들에게 코드에서 오류를 발견하도록 요청하는 것은 특히 생산성이 높지 않습니다. 디버거를 사용하거나 인쇄 문을 추가하여 프로그램의 진행 상황을 추적하고 발생 예상과 비교하여 문제를 격리해야합니다. 이 둘이 갈라지면 문제를 발견했습니다. (그리고 필요한 경우, [최소 테스트 케이스] (http://sscce.org)를 구성해야합니다. –

+0

디버거를 사용 했습니까? 그렇다면 처음 두 개의'strcpy' 이후'temp'의 내용을 검사하십시오. –

+1

@LuchianGrigore'temp'는 strcpy 다음에 그냥 "World"입니다. –

답변

3

문제는 여기에있다. 대신 strcat를 사용하여 버퍼에 다른 문자열의 데이터를 추가 할 : 제리가 지적 하듯이

strcat(temp, other.data()); 

, 다른 문제가 올바르게 처음에 문자열을 초기화하는하지 않을 것입니다. 당신이 등을 strcpy, strcat을 사용하려고하는 경우 여담으로

는, 당신은 정말 잠재적 인 버퍼 오버런 문제를 방지하기 위해 길이 제한 버전 (strncpy, strncat)를 사용합니다.

+0

여전히 출력되지 않습니다 - http://ideone.com/8GJBRp#view_edit_box –

+0

@Paul 데모를 보았습니까? –

+0

길이를 고려했을 때 길이 제한 버전을 사용해야하는 이유는 무엇입니까? AAMOF memcpy보다 str * 함수를 사용하는 이유는 무엇입니까? –

3

demo you posted의 주소는 the comment이며 Mac's answer입니다. 이 문제가 발생합니다 :

string(char const *str) : buffer(new char[strlen(str)]), len(strlen(str)) 
{} 

// ... 

string s1 = "Hello"; 

버퍼를 생성자에 할당하지만 데이터를 복사하지는 않습니다. std::cout << s1;을 어떻게하면됩니까?


편집 : 당신은 operator +=

  • 귀하의 복사 생성자에 len를 업데이트하지 않는 두 string의 지점을하고있다

    • : 그건 그렇고, 나는 적어도 두 개의 다른 문제를 발견 같은 버퍼 이것은 나쁘다, 다른 사람이 그것을 사용하려고 할 때 다른 것 delete[] 그것을 날려 버릴 것이다.
  • +0

    std :: cout << s1과 std :: cout << s2가 + = – Paul

    +0

    앞에 main에 추가되었을 때, 그대로 s1과 s2를 출력하지 않는다는 것을 확인했다. strcpy (buffer, str)'을 호출하고 mem-init-list의 첫 번째 false 부분을'new char [strlen (str) +1]'로 변경했으나 여전히 아무것도 아니 었습니다 - http://ideone.com/8GJBRp#view_edit_box –

    +0

    좋아, 지금 일하는 것이 신경 쓰이지 않는다. –

    관련 문제