kyuseo의 게임 프로그래밍

어느 초심자의 코드를 수정, 지적해 보았습니다. 본문

C++ 개발

어느 초심자의 코드를 수정, 지적해 보았습니다.

kyuseo 2008. 1. 6. 17:42

개요..

 

예전에 프로그래밍을 배우시는 초심자 분으로부터 질문을 받았습니다.

 

컴파일 오류 관련 질문인데stl 의 string 의 용법을 잘 몰라서 한 실수였습니다.

   

우선 질문의 정답은

오류코드 : if( strcmp( str, second ) == 0 )

 

수정코드 : if( strcmp( str.c_str(), second.str.c_str() ) == 0 )

 

하지만 코드를 살피던 도중 너무 큰 문제점들이 보여서 몇몇 오류를 지적해보았습니다.

 

"백문이 불여일타!!!"이고 모르면 찾아보고 물어보고, 그것이 배우는 지름길임에는 틀림이 없고 질문자의 큰 발전을 이루겠지요.

 

아래 코드의 주석 내용을 잘 살펴보셔서 조금은 도움이 되시길 기원합니다.

 

코드

 

 

#include <iostream>

#include <string>

 

using namespace std;

 

class _string

{

public:

    _string()

    {

        // stl의 str은 자체 생성자를 지원하므로 아래 코드는 필요없다.

        // 즉 군더더기 코드는 코드의 명확성을 상실 시키며 오류의 온상이 될 수 있다.

        str = "";

    }

 

    _string( const string& str )

    {

        // 일반적으로 this 라는 표기는 사용하지 않는다.

        // 만일 표기할것이라면 print() 등에서는 왜 하지 않는가?

        this->str = str;

    }

 

    void print() const

    {

        cout << str << endl;

    }

 

    string GetData() const

    {

        return str;

    }

 

    // 연산자 오버로드의 핵심을 매우 잘못 처리한 매우 잘못된 코드...

    // 이 코드는 아래와 같은 코드로 바뀌어야한다.

/*

    operator ==( const _string& second )

    {

        if( strcmp( str.c_str(), second.str.c_str() ) == 0 )

            cout << " 두 문자열이 같습니다! "<< endl;         

        else

            cout << " 두 문자열이 다릅니다! "<< endl;

    }

*/

    //** 수정안 (참고로 일반적으로 이러한 비교연산은 friend함수로 하는것이 일반적임)

    booloperator ==( const _string& second )

    {

        return( str == second.str );

    }

 

private:

    string str;

};

 

 

 

void main()

{

    _string a;

    _string b;

    

    a = _string("hello");

    b = _string("World!");

    

    a.print();

    b.print();

    

    // 이러한 코드는 위에서 지적한대로 아래와 같이 바뀌어야 한다.

    a==b;

 

    //** 수정안

    if( a == b )    

        cout << " 두 문자열이 같습니다! "<< endl;         

    else            

        cout << " 두 문자열이 다릅니다! "<< endl;

 

    //** 이러한 테스트 프로그램에서는 아래와 같이 추가 테스트가 필수적이다.

    b = _string("hello");

 

    if( a == b )    

        cout << " 두 문자열이 같습니다! "<< endl;         

    else            

        cout << " 두 문자열이 다릅니다! "<< endl;

}