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