C++은 언어적인 차원에서 동적어레이 리턴을 지원하지 않습니다.
물론 포인트 리턴을 받아서 처리하는 방법이 있지만 이는 불편한 경우가 많으며
에러 방지를 위해 조금 더 코딩에 신경을 써 주어야 합니다.
C# 등의 언어는 String[] 식으로 매우 간편하게 동적 어레이를 다룰 수 있는데,
C++도 수고만 한다면 그런 편의성 이상도 당연히 획득할 수 있습니다.
C++은 개발자가 동작의 베이스까지 설계할 수 있는 언어이지만
바쁜데 그런 수고할 틈도 없고 할 때는
코드가 간편하니 에러의 가능성이 그 만큼 낮은
이런 간편한 베이스 클래스를 가지고 자신의 기능을 덧붙여 쓰는게 더 편리할 지도 모르겠습니다.
그냥 생각나서 빨리 코딩해 봤습니다.
나중에 필요할 때 긁어 쓰기 쉽게.
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// C++Array의 일반화 클래스.
// 이 클래스는 일반적인 동적 어레이를 리턴한다던지 하는 목적으로 사용하기 위해
// 간편하게 설계되었다.
template
class KArray
{
T * aList;
int _length;
private:
void Init(int size)
{
_length = size;
aList = new T[size];
}
public:
__property int Length = { read=_length };
public:
KArray(int size)
{
Init(size);
}
~KArray()
{
Dispose();
}
T& operator[] (int index)
{
return aList[index];
}
// 여기서는 객체 이동이 일어나므로, 그 점을 인지하고 Resizing을 해야 한다.
void Resizing(int new_size)
{
T *p = new T[new_size];
for(int c = 0; c < _length && c < new_size; c++)
p[c] = aList[c];
delete[] aList;
aList = p;
_length = new_size;
}
};
// 자신이 만들고 싶은 형 정의.
typedef KArray KStringArray;
// 동적 어레이 클래스를 리턴하는 함수.
KStringArray& GetList()
{
char *list[4] =
{
"aaaa", "bbb", "cccc", ""
};
KStringArray& a = *new KStringArray(3);
for(int c = 0; c < a.Length; c++)
a[c] = list[c];
return a;
}
// test
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 동적 어레이를 리턴 받는게 이렇게 쉽게 됩니다.
KStringArray list = GetList();
for(int c = 0; c < list.Length; c++)
{
Memo1->Lines->Add(list[c]);
}
list.Resizing(2);
for(int c = 0; c < list.Length; c++)
{
Memo1->Lines->Add(list[c]);
}
// GetList 예제 함수에서 동적 어레이 힙에 생성한 뒤 리턴했지만,
// list 변수의 사용이 끝나면 자동으로 메모리에서 사라진다.
}
//---------------------------------------------------------------------------
만일,
KStringArray& list = GetList();
이와 같이 하면 위 예제와는 달리 어레이를 받을 때 포인트나 참조자로 바로 객체로 받으면
이 객체는 해당 스코프를 벗어나도 파괴되지 않습니다.
그러므로 이는 나중에 필요할때 따로 소멸시켜 주어야 합니다.
그러므로 그냥 객체 변수로 받는게 편합니다.
|
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=685
이번에 올린팁과 어떻게 다르죠?