Reference Member Variable
class A { public: int data[2]; int &x, &y; A(): x(data[0]), y(data[1]) {} A( int xx, int yy ): x(data[0]), y(data[1]) { x=xx; y=yy; } }; int main( int argc, char** argv ) { A a( 1, 2 ); cout << sizeof(a) << endl; cout << a.x << " " << a.y << endl; cout << a.data[0] << " " << a.data[1] << endl; return 0; }
<출력결과>
24
1 2
1 2
(주의할 점)
– a의 크기
– 멤버 변수 초기화
위와 같이 하는 것 보다는 다음과 같이 하는 것이 더 훌륭한 방법이다.
class A { public: union { struct { int x, y }; int data[2]; }; A(): x(0), y(0) {} A( int xx, int yy ): x(0), y(0) { x=xx; y=yy; } }; int main( int argc, char** argv ) { A a( 1, 2 ); cout << sizeof(a) << endl; cout << a.x << " " << a.y << endl; cout << a.data[0] << " " << a.data[1] << endl; return 0; }
<출력결과>
8
1 2
1 2
다음과 같이 한 단계 더 발전시킬 수도 있다.
class A { public: union { struct { union { int x, X; }; union { int y, Y; }; }; int data[2]; }; A(): x(0), y(0) {} A( int xx, int yy ): x(0), y(0) { x=xx; y=yy; } }; int main( int argc, char** argv ) { A a( 1, 2 ); cout << sizeof(a) << endl; cout << a.x << " " << a.y << endl; cout << a.X << " " << a.Y << endl; cout << a.data[0] << " " << a.data[1] << endl; return 0; }
<출력결과>
8
1 2
1 2
1 2
상속되는 부모의 멤버 변수도 reference member variable을 이용할 수 있다.
class Parent { public: int data[2]; Parent() { data[0] = data[1] = 0; } }; class Child: public Parent { public: int &x, &y; Child(): x(Parent::data[0]), y(Parent::data[1]) {} };
그러나…
이런식으로 처리는 가능하겠지만,
역시 reference member variable을 사용했을 때의 문제는
sizeof()로 크기를 구했을 때, 의도한 것 보다 더 커진다는 것이다.
상속되는 클래스에서 union과 같은 방법을 사용할 수는 없는 것인가?
class Parent { public: int data[2]; Parent() { data[0] = data[1] = 0; } }; class Child: public Parent { public: Child() {}</pre> <strong> int& x() { return data[0]; } const int& x() const { return data[0]; }; </strong> <pre><strong> int& y() { return data[1]; } const int& y() const { return data[1]; }; };
궁여지책으로 위와 같은 방법을 사용하고는 있지만,
Child c; c.x() = c.y() = 1; 이렇게 괄호를 붙여야 하는 코딩상의 불편함이 존재한다.