[완료]클래스 초기화 시에 레퍼런스에 대해..

kid1402의 이미지

클래스의 생성자에서 멤버 변수들을 초기화할 때, 레퍼런스 멤버 변수는 선언하자 마자 초기화가 되야하고 + 대상체가 실제 메모리를 점유해야 하기 때문에

생성자의 파라미터로 넘겨준 값만 받을 수 있다고 알고 있습니다..

그러니까 말하자면

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) {}
};

위의 코드와 같습니다.

좋은 해결책 없을까요?

klara의 이미지

레퍼런스는 가리키는 대상을 바꿀수 없습니다. (nullptr을 포함하여) 가리키는 대상을 바꿔야 한다면 포인터를 사용하시면 됩니다.

kid1402의 이미지

네.. 그건 저도 알고 본문에도 적혀있습니다..

제가 궁금한건, '레퍼런스 멤버는 생성자에서 NULL로 초기화가 안되는것이냐' 입니다..

object로 NULL 을 타입캐스팅 한다던가 -_-;; 하는 갖가지 방법을 써봤지만 컴파일러가 자꾸 생성자에 추가하라네요.

정녕 레퍼런스를 널로 생성하는 방법은 없는건가요?

klara의 이미지

불가능한 건 아닙니다. 포인터에 널포인터를 대입한후 포인터의 참조연산자로 레퍼런스에 대입하면됩니다.

object *ptr = nullptr;
object &ref = *ptr;

하지만 일반적으로 레퍼런스는 인스턴스에 대한 레퍼런스이기 때문에, 널에 대한 레퍼런스는 의미가 없습니다.
사용자 입장에서 레퍼런스로 넘겨주는 변수가 사실은 메모리상에 존재하지 않는 객체일 거라는것은 상정하지 않습니다.
포인터 변수가 널포인터인지는 검사해보기도 하지만, 레퍼런스 변수가 (적어보자면)널레퍼런스인지는 아무도 검사하지 않습니다.
아무것도 가리키지 않는 레퍼런스라는게 정말로 필요한 클래스라면, 클래스의 설계를 다시 생각해볼 필요가 있습니다.

kid1402의 이미지

음..그렇군요. 좋은 조언 감사합니다.

결국 '레퍼런스 멤버가 있다'는 것은 '클래스를 생성할 때 반드시 해당 멤버를 초기화해줘야 한다'는 제약사항을 뜻하는 거라고 봐야겠네요.

이걸 염두에 두고 클래스를 설계해야겠습니다!

감사합니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.