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;  이렇게 괄호를 붙여야 하는 코딩상의 불편함이 존재한다.

답글 남기기