본문 바로가기
카테고리 없음

string 클래스

by ByteBridge 2013. 3. 2.
반응형


stdfx.h 헤더

#pragma once


#include "targetver.h"


#include <stdio.h>

#include <tchar.h>

#include <iostream >


using namespace std;

======================================================

#pragma once


class cMyString

{

private:

//< NULL을 제외한 문자열의 길이

int m_nLength;

//< 문자열

char* m_pStr;


public:

//< 생성자

cMyString(void);

//< 인자가 있는 생성자

cMyString( const char* pStr );

//< 복사생성자

cMyString( const cMyString& rhs );

//< 소멸자

~cMyString(void);


//< 길이를 반환 

inline unsigned int size( void ) const { return m_nLength; }

inline unsigned int length( void ) const { return m_nLength; }


//< char*를 반환하는 함수

const char* c_str( void ) const { return m_pStr; }


//< 연산자 오버로딩 

cMyString& operator=( const char* pStr );

cMyString& operator=( const cMyString& rhs );


cMyString& operator+=( const char* pStr );

cMyString& operator+=( const cMyString& rhs );


cMyString operator+( const char* pStr );

cMyString operator+( const cMyString& rhs );


bool operator==( const char* pStr );

bool operator==( const cMyString& rhs );

char& operator[]( const int nIndex );

const char& operator[]( const int nIndex ) const;


//< 출력또는 입력

friend ostream& operator<<( ostream& os, const cMyString& s )

{

os << s.m_pStr;

return os;

}


friend istream& operator>>( istream& is, cMyString& s )

{

char str[_MAX_FNAME];

is >> str;

s = cMyString(str);


return is;

}

};


======================================
#include "StdAfx.h"
#include "cMyString.h"

//< 디폴트 생성자
cMyString::cMyString(void)
:m_nLength(0),m_pStr(NULL)
{
m_pStr = new char[ 1 ];
m_pStr[0] = NULL;
}

//< 인자가 있는 생성자
cMyString::c
 MyString( const char* pStr )
{
m_nLength = strlen( pStr );
if( m_nLength != 0 )
{
m_pStr = new char[ m_nLength + 1 ];
strcpy_s( m_pStr , m_nLength + 1, pStr );
}
else
{
m_pStr = new char[ 1 ];
m_pStr[0] = NULL;
}
}
//< 복사생성자
cMyString::cMyString( const cMyString& rhs )
:m_nLength( rhs.m_nLength )
{
if( m_nLength != 0 )
{
m_pStr = new char[ m_nLength + 1 ];
strcpy_s( m_pStr , m_nLength + 1, rhs.m_pStr );
}
else
{
m_pStr = new char[ 1 ];
m_pStr[0] = NULL;
}
}

//< 소멸자
cMyString::~cMyString(void)
{
SAFE_DELETE_ARRAY(m_pStr);
}

//< 연산자 오버로딩 
cMyString& cMyString::operator=( const char* pStr )
{
if( pStr != NULL )
{
//< 기존 버퍼 삭제
SAFE_DELETE(m_pStr);

m_nLength = strlen( pStr );
m_pStr = new char[ m_nLength + 1 ];
strcpy_s( m_pStr , m_nLength + 1, pStr );
}
return *this;
}
cMyString& cMyString::operator=( const cMyString& rhs )
{
//< 자신확인
if( this == &rhs )
{
return *this;
}

//< 기존 버퍼 삭제
SAFE_DELETE(m_pStr);

m_nLength = rhs.m_nLength;
m_pStr = new char[ m_nLength + 1 ];
strcpy_s( m_pStr , m_nLength + 1, rhs.m_pStr );

return *this;
}

cMyString& cMyString::operator+=( const char* pStr )
{
return *this += cMyString(pStr);
}
cMyString& cMyString::operator+=( const cMyString& rhs )
{
//< 기존 뒤에 붙이는것 ( 기존 버퍼를 위해 보관 )
char* old;
old = m_pStr;

//< 갯수 증가
m_nLength += rhs.m_nLength;

m_pStr = new char[ m_nLength + 1 ];

//<임시로 저장되었던 문자열 복사
strcpy_s( m_pStr ,m_nLength + 1, old);

//<새롭게 추가되는 문자열 복사
strcat_s( m_pStr ,m_nLength + 1, rhs.m_pStr);
//< 기존 버퍼 삭제
delete[] old;

return *this;
}

cMyString cMyString::operator+( const char* pStr )
{
return cMyString();
}
cMyString cMyString::operator+( const cMyString& rhs )
{
return cMyString();
}

bool cMyString::operator==( const char* pStr )
{
return false;
}
bool cMyString::operator==( const cMyString& rhs )
{
return false;
}

char& cMyString::operator[]( const int nIndex )
{
return m_pStr[0];
}
const char& cMyString::operator[]( const int nIndex ) const
{
return m_pStr[0];
}
===========================================
// 00_MyString.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include "stdafx.h"
#include "cMyString.h"


int _tmain(int argc, _TCHAR* argv[])
{
cMyString s("테스트");
cMyString t("....");
cout << s << endl;
cout << s.c_str() << endl;
cout << s.length() << endl;
cout << s.size() << endl;
s += "이런";

cout << s << endl;
s += t;
cout << s << endl;
return 0;
}

반응형