앞서 제가 글을 올렸는데 정리를 더 해서 오해를 만들 지 말았어야 했는데 .. 뭐 제가 표현력이 없어서 그렇다고 생각하시면 될 것 같습니다.
좀 더 좋은 내용으로 가는게 제 목적이구요, 이번엔 좀 더 깔끔한 코드 준비했습니다.
대상은 swap 함수. 포인터 예제로 간단하면서 실용성이 높은 함수입니다. 또 제가 자주 사용하는 함수이기도 합니다.
class User {
private:
int id;
public:
int hp;
User() : id(0), hp(0){};
void SetId(int v) { id = v;}
int GetId() { return id; }
};
void Swap (void* _a, void* _b, int width) {
char* a =(char*)_a;
char* b =(char*)_b;
char tmp;
if(a == b)
return;
while (width--) {
tmp = *a;
*a++ = *b;
*b++ = tmp;
}
}
//...
int main() {
User a;
User b;
a.SetId(100);
b.SetId(100000000);
Swap(&a, &b, sizeof(User));
printf(" a.id = %d\n", a.GetId());
return 0;
}
데이터 타입에 관계 없이 모든 데이터에 대해서 swap이 될 수 있도록 void형 포인터로 인수 값을 받습니다.
void 포인터는 주소만 받기 때문에 이를 byte 단위로 복사하기 위해서 char형 포인터로 캐스팅 했습니다.
User 클래스는 private를 가지고 있으나 swap 함수에서는 그런거 필요 없게 됩니다.
a 객체의 id를 100으로 설정하고 b의 객체의 아이디를 100000000 설정해서 Swap 함수로 돌리면 둘은 바뀌었음을 볼 수 있습니다.
이 함수는 멤버의 접근 권한이나 뭐 그런 거 없이 그리고 객체의 타입에 상관 없이 swap시켜준다는 것입니다.