C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[970] 동적 어레이 리턴을 쉽게 하는 어레이 베이스 클래스. Array Base Class
김태선 [cppbuilder] 8176 읽음    2010-03-17 16:06
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(); 
이와 같이 하면 위 예제와는 달리 어레이를 받을 때  포인트나 참조자로 바로 객체로 받으면
이 객체는 해당 스코프를 벗어나도 파괴되지 않습니다.
그러므로 이는 나중에 필요할때 따로 소멸시켜 주어야 합니다.

그러므로 그냥 객체 변수로 받는게 편합니다.
장성호 [nasilso]   2010-03-17 16:28 X
김태선님이 3년전에 올린 Dynamic Array Class 팁이 있던데..
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=685

이번에 올린팁과 어떻게 다르죠?
김태선 [cppbuilder]   2010-03-17 17:01 X
저보다 기억력이 좋으시군요. 저의 뇌 속 깊은 곳에 봉인되어 있던 것을.

이번에는 리턴시 동적어레이를 가장 편하게 받아 처리하는 것에 초점을 맞췄습니다.
차이점은 각자 느낌대로.
장성호 [nasilso]   2010-03-18 03:09 X

+ -

관련 글 리스트
970 동적 어레이 리턴을 쉽게 하는 어레이 베이스 클래스. Array Base Class 김태선 8176 2010/03/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.