[완료]클래스 초기화 시에 레퍼런스에 대해..
글쓴이: kid1402 / 작성시간: 금, 2012/06/29 - 12:48오후
클래스의 생성자에서 멤버 변수들을 초기화할 때, 레퍼런스 멤버 변수는 선언하자 마자 초기화가 되야하고 + 대상체가 실제 메모리를 점유해야 하기 때문에
생성자의 파라미터로 넘겨준 값만 받을 수 있다고 알고 있습니다..
그러니까 말하자면
class context{ private : object & obj; public: context( object & obj) : obj(obj) {} };
위와 같은 방법으로 밖에 초기화가 안된다.. 고만 알고 있습니다.
그런데 생성자에 아무것도 넘기지 않은 void 생성자가 필요한 경우가 와서, 생성자의 파라미터에 레퍼런스 인수목록이고 뭐고 아무것도 넘겨줄 수 없는 상황이 오면 어떻게 해야할까요?
단, 멤버로 레퍼런스 목록은 유지한채로 말이죠..
생성자에서 레퍼런스 멤버 변수에 NULL 도 넣어 봤지만 레퍼런스는 한번 대입받은 값을 바꿀 수 없기 때문에 안될거 같고 (컴파일시에 에러도 뜨더군요),
아예 안쓴다는걸 알려주기 위해서 생성자에서 object를 동적할당 받아서 레퍼런스 멤버에 대입해줄까.. 도 생각해봤는데, 왠지 비효율적일 거 같더라구요.
그러니까 제가 원하는건 결국
class context{ private : object & obj; public: context() { obj = // 무엇을 대입해야 널 생성자가 될까? } context( object & obj) : obj(obj) {} };
위의 코드와 같습니다.
좋은 해결책 없을까요?
Forums:
레퍼런스는 가리키는 대상을 바꿀수 없습니다.
레퍼런스는 가리키는 대상을 바꿀수 없습니다. (nullptr을 포함하여) 가리키는 대상을 바꿔야 한다면 포인터를 사용하시면 됩니다.
네..
네.. 그건 저도 알고 본문에도 적혀있습니다..
제가 궁금한건, '레퍼런스 멤버는 생성자에서 NULL로 초기화가 안되는것이냐' 입니다..
object로 NULL 을 타입캐스팅 한다던가 -_-;; 하는 갖가지 방법을 써봤지만 컴파일러가 자꾸 생성자에 추가하라네요.
정녕 레퍼런스를 널로 생성하는 방법은 없는건가요?
불가능한 건 아닙니다. 포인터에 널포인터를 대입한후
불가능한 건 아닙니다. 포인터에 널포인터를 대입한후 포인터의 참조연산자로 레퍼런스에 대입하면됩니다.
object *ptr = nullptr;
object &ref = *ptr;
하지만 일반적으로 레퍼런스는 인스턴스에 대한 레퍼런스이기 때문에, 널에 대한 레퍼런스는 의미가 없습니다.
사용자 입장에서 레퍼런스로 넘겨주는 변수가 사실은 메모리상에 존재하지 않는 객체일 거라는것은 상정하지 않습니다.
포인터 변수가 널포인터인지는 검사해보기도 하지만, 레퍼런스 변수가 (적어보자면)널레퍼런스인지는 아무도 검사하지 않습니다.
아무것도 가리키지 않는 레퍼런스라는게 정말로 필요한 클래스라면, 클래스의 설계를 다시 생각해볼 필요가 있습니다.
음..
음..그렇군요. 좋은 조언 감사합니다.
결국 '레퍼런스 멤버가 있다'는 것은 '클래스를 생성할 때 반드시 해당 멤버를 초기화해줘야 한다'는 제약사항을 뜻하는 거라고 봐야겠네요.
이걸 염두에 두고 클래스를 설계해야겠습니다!
감사합니다
댓글 달기