멤버 포인터 변수는 특정 클래스에 속한 멤버만을 가리키는 포인터이다.
타입 클래스::*이름;
class MyClass
{
public:
int i,j;
double d;
};
void main()
{
MyClass C;
int MyClass::*pi;
double MyClass::*pd;
int num;
pi=&MyClass::i;
pi=&MyClass::j;
pd=&MyClass::d;
//pd=&MyClass::i;
//pi=&MyClass::d;
//pi=#
}
위 코드 처럼 선언한 클래스와 타입에 대해서만 대입이 허용된다.
대입을 할 때에는 &Class::Member 형식으로 대입한다.
멤버포인터 변수로 객체의 멤버를 액세스 할때는 멤버 포인터 연산자를 이용한다.
Obj.*mp
pObj->*mp
첫번째는 객체 Obj의 멤버 포인터 변수 mp가 가리키는 멤버를 읽는 것이고
두번째는 포인터변수 pObj에서 멤버 포인터 변수 mp가 가리키는 멤버를 읽는것이다.
아래 코드는 멤버 포인터 변수로 객체의 멤버 값에 접근하는 예이다.
class Position
{
public:
int x,y;
char ch;
Position() {x=0;y=0;ch='A';}
void OutPosition() {
gotoxy(x, y);putch(ch);
}
};
void main()
{
Position Here;
Position *pPos=&Here;
int Position::*pi;
pi=&Position::x;
Here.*pi=30;
pi=&Position::y;
pPos->*pi=5;
Here.OutPosition();
}
다음은 멤버 포인터 변수의 활용 예이다.
class Test;
typedef void (Test::*fpop)(int,int);
class Test
{
public:
void Op1(int a,int b) { printf("%d\n",a+b); }
void Op2(int a,int b) { printf("%d\n",a-b); }
void Op3(int a,int b) { printf("%d\n",a*b); }
};
void main()
{
int ch;
Test t;
int a=3,b=4;
static fpop arop[3]={&Test::Op1,&Test::Op2,&Test::Op3};
printf("연산 방법을 선택하시오. 0=더하기, 1=빼기, 2=곱하기 : ");
scanf("%d",&ch);
if (ch >= 0 && ch <= 2) {
(t.*arop[ch])(3,4);
}
}
void형의 int 인수 2개를 받는 Test 클래스의 멤버함수 포인터를 fpop이라고 하고 op1,op2,op3 각 멤버함수들의 번지를 fpop 배열에 집어 넣는다. 그리고 필요에 따라 꺼내 쓴다. 그 외에 특징은
①정적 멤버 변수를 멤버 변수 포인터에 대입할 수 없다. 정적 멤버 변수는 클래스 소속일 뿐 객체와 상관 없기 때문에
②레퍼런스 멤버의 번지도 대입할 수 없다. 멤버에 대한 레퍼런스라는 개념은 없기 때문에
③증감연산자를 사용할 수 없다. 함수 포인터를 증감할 수 없는 것과 같다.
'C++' 카테고리의 다른 글
| [C++] auto_ptr (0) | 2022.01.09 |
|---|---|
| [C++] 네임 스페이스 (0) | 2022.01.08 |
| [C++] 캐스트 연산자 (static, dynamic, const, reinterpret) (0) | 2022.01.07 |
| [C++] RTTI (0) | 2022.01.07 |
| [C++] 예외 객체 (0) | 2022.01.07 |