배열 다룰때 C++고유의 원시적인 형태가 아닌
C#이나 java처럼 크기를 바로 참조하여 편리하게 배열을 다루기 위한 배열 래퍼 템플릿 클래스 입니다.
프로그램의 편의성을 증대시킵니다.
상당히 간결한 형태이지만 실전에 사용해보니 은근히 편리해서 올립니다.
값을 지정할때는 원시 배열에 직접 지정하는 것과 같다는 사실만 주의하면 됩니다.
이 클래스가 별도의 배열값의 사본을 가지는게 아니고 원시 배열을 그대로 엑세스하기 때문입니다.
#ifndef __CArray_H
#define __CArray_H
//---------------------------------------------------------------------------
/*
배열 래퍼 클래스.
java, C# 처럼 배열과 그 배열의 크기를 지정한 클래스.
주의할 것은 배열크기는 처음에 지정하면 변화시키지 못한다.
변화 시키려면 인자로 썼던 모배열의 크기를 변화 시키고
다시 이 클래스에 대입하면 된다.
이 클래스는 배열에 대한 서비스형 래퍼클래스이기 때문이다.
하지만 CArray[n] = 데이타; 식으로 값일 직접 변경하는 것은 무방하다.
Written by KTS.
*/
template
class CArray
{
T *Array;
public:
int Length;
public:
CArray()
{
Array = NULL;
Length = 0;
}
CArray(T *array, int length)
{
SetArray(array, length);
}
void SetArray(T *array, int length)
{
Array = array;
Length = length;
}
T& operator [] (int idx)
{
if (idx < 0 || idx >= Length)
throw new Exception("CArray[] : index is out of length");
return Array[idx];
}
bool IsExists(T item)
{
return GetIndex(item) >= 0;
}
int GetIndex(T item)
{
for(int c = 0; c < Length; c++)
{
if (item == Array[c])
return c;
}
return -1;
}
};
typedef CArray CArrayInt;
typedef CArray CArrayPChar;
typedef CArray CArrayString;
typedef CArray CArrayAnsiString;
typedef CArray CArrayWideString;
//typedef CArray CArrayUnicodeString;
//---------------------------------------------------------------------------
#endif
사용은 이런 식으로 하시면 됩니다.
예제.
void __fastcall TFormDataBrow::FormCreate(TObject *Sender)
{
String s;
// 정수배열
int list1[] = { 1, 2, 3, 99 };
CArray array1(list1, sizeof(list1) / sizeof(int));
array1[3] = 4;
for(int c = 0; c < array1.Length; c++)
{
s += array1[c];
s += " ";
}
// 문자열 배열
char *list[] = { "한글", "두글", "세글", "글글" };
CArray array(list, sizeof(list) / sizeof(char *));
array[3] = "네글";
for(int c = 0; c < array.Length; c++)
{
s += array[c];
s += " ";
}
// 스트링 클래스 배열
String list2[] = { "한글2", "두글2", "세글2", "글글2" };
CArray array2(list2, sizeof(list2) / sizeof(String));
array2[3] = "네글2";
for(int c = 0; c < array2.Length; c++)
{
s += array2[c];
s += " ";
}
Caption = s;
}
특히 다른 함수를 호출할때 함수 인자로 쓰면 매우 편리합니다.
이 클래스의 진정한 가치틑 바로 이런 활용에 있습니다.
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
String list[] = { "한글", "두글", "세글" };
CArrayString alist(list, sizeof(list) / sizeof(String));
String s = Disp(alist);
for(int c = 0; c < alist.Length; c++)
{
s += alist[c] + " ";
}
Caption = s;
}
//---------------------------------------------------------------------------
String TForm1::Disp(CArrayString list)
{
String s;
for(int c = 0; c < list.Length; c++)
{
s += list[c] + " ";
}
return s;
}
//---------------------------------------------------------------------------