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

C++빌더 Q&A
C++Builder Programming Q&A
[71978] Re:operator[] 오버로딩 관련 질문입니다.
박우성 [solgari] 3452 읽음    2014-11-13 11:48
int &operator[](int idx)와 같이 레퍼런스 형태로 사용하면 될 것 같지만, 비트필드에는 레퍼런스를 사용할 수 없습니다.

제가 생각할 때는  SetValue함수를 만들어 사용하는 것이 가장 효율적인 것 같습니다.
굳이 배열 형태로 사용하고 싶다면, 다음과 같이 클래스를 만들어 처리할 수 있습니다.

대충 만들어 봤는데, 보완해서 사용하시면 될 거 같네요.

class Int12x8Helper;

#pragma pack(1)
struct int12x8 {
	int v0 : 12;
	int v1 : 12;
	int v2 : 12;
	int v3 : 12;
	int v4 : 12;
	int v5 : 12;
	int v6 : 12;
	int v7 : 12;

	Int12x8Helper operator[](int idx);
};
#pragma pack()

class Int12x8Helper
{
private:
	struct int12x8 &ref;
	int idx;
public:
	Int12x8Helper( int12x8 &obj, int index );
	operator int();
	void operator=( int value );
};

Int12x8Helper int12x8::operator[](int idx) {
	Int12x8Helper ref( *this, idx );
	return ref;
}

Int12x8Helper::Int12x8Helper( int12x8 &obj, int index ) : ref(obj), idx(index)
{
}

Int12x8Helper::operator int()
{
	switch( idx ){
		case 0 : return ref.v0;
		case 1 : return ref.v1;
		case 2 : return ref.v2;
		case 3 : return ref.v3;
		case 4 : return ref.v4;
		case 5 : return ref.v5;
		case 6 : return ref.v6;
		case 7 : return ref.v7;
	}
	return 0;
}

void Int12x8Helper::operator=( int value )
{
	switch( idx ){
		case 0 : ref.v0 = value; break;
		case 1 : ref.v1 = value; break;
		case 2 : ref.v2 = value; break;
		case 3 : ref.v3 = value; break;
		case 4 : ref.v4 = value; break;
		case 5 : ref.v5 = value; break;
		case 6 : ref.v6 = value; break;
		case 7 : ref.v7 = value; break;
	}
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int12x8 tmp ;

	tmp.v0 = 123;

	ShowMessage( (int)tmp[0] );

	tmp[1] = 456;

	ShowMessage( tmp.v1 );
	ShowMessage( (int)tmp[1] );
}



빌더초보 님이 쓰신 글 :
: 어떤 어플에서 주로 사용 하는 데이터 형이 short 형인데,
: 대입하는 수의 범위가 0 ~ 4095 까지 입니다.
: 즉 16 비트 중,  12 비트만을 사용하며, 4비트를 낭비하고 있죠.
:
: 뭐 4비트 차이야 문제가 없지 않냐 할수 있겠지만 저장 하는 용량 자체가 무시 하지 못 할 수준입니다.
: 많으면 약 400 기가 정도... 12비트만 사용 한다면 무려 100 기가가 줄어 듭니다.
:
: 그래서...
: 비트 필드를 사용하고,
: 4byte 단위로 만들기 위해 int 형 8개를 묶는 방법을 생각 했습니다.
: 사용 편의를 위해 [] 연산자 오버로딩도 했고요.
:
:
: 
: #pragma pack(1)
: struct int12x8 {
: 	int v0 : 12;
: 	int v1 : 12;
: 	int v2 : 12;
: 	int v3 : 12;
: 	int v4 : 12;
: 	int v5 : 12;
: 	int v6 : 12;
: 	int v7 : 12;
: 
: 	int operator[](int idx) {
: 		if (idx == 0) {
: 			return v0;
: 		}else if (idx == 1) {
: 			return v1;
: 		}else if (idx == 2) {
: 			return v2;
: 		}else if (idx == 3) {
: 			return v3;
: 		}else if (idx == 4) {
: 			return v4;
: 		}else if (idx == 5) {
: 			return v5;
: 		}else if (idx == 6) {
: 			return v6;
: 		}else {
: 			return v7;
: 		}
: 	}
: };
: #pragma pack()
: 
: 

:
: 12 바이트로 정상적으로 저장 불러오기 잘 되는것 까지 확인 했는데
:
: 문제는, [] 연산자로 호출(get)은 되는데, 대입(set)이 안되더군요.
:
:
:
: int12x8 tmp ;
: 
: tmp.v0 = 1;
: 
: ShowMessage(tmp[0]); // 정상
: 
: tmp[0]=1; // 애러
: 

:
: 위 구조체를
:
: tmp[0]=값;
:
: 처럼 쓸수 있는 방법이 없을까요?
:
:
:
: __property int v[int i] = {read = GetValue , write = SetValue};
:
: 이 처럼 프로퍼티를 하나 선언 하면,
:
: tmp.v[0]=1;
: 형태로 사용 가능 하긴 한데, 영... 내키지가 않더군요...
:
:
: 또 한,
: = 연산자를 오버로딩 하려고 했지만, "인수가 한 개만 있어야 한다"는 애러가 뜹니다.
:
:
: 질문을 요약 하자면...
: 여러개의 변수를 묶은 비트필드 구조체에서
: 각 변수에 배열처럼 접근할 수 있는 방법이 있나요?
:
:
: 좋은 조언 부탁 드립니다.

+ -

관련 글 리스트
71974 operator[] 오버로딩 관련 질문입니다. 빌더초보 3556 2014/11/12
71982     Re:operator[] 오버로딩 관련 질문입니다. 빌더초보 3677 2014/11/13
71978     Re:operator[] 오버로딩 관련 질문입니다. 박우성 3452 2014/11/13
71977     Re:operator[] 오버로딩 관련 질문입니다. 안영제 3281 2014/11/13
71975     Re:operator[] 오버로딩 관련 질문입니다. 기초 3418 2014/11/13
71976         Re:Re:operator[] 오버로딩 관련 질문입니다. 박우성 3472 2014/11/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.