[C++] 클래스 맴버 변수로 클래스 변수 등록시 생성자 호출 막는 방법

arabyoru의 이미지

안녕하세요.
그 동안 줄곧 C로 개발하다가 이직 하면서 C++로 개발 하게 되어서 C++ 다시 한번 훓고 있는 중에 궁금한 점이 있어 질문 드립니다.

제목 그대로입니다. 클래스 내의 클래스 맴버 변수를 등록 하게 되면 클래스 생성시 생성자가 호출 되어 생성이 되어 버리게 됩니다. 제가 원하는 것은 등록만 해놓은 뒤 나중에 사용을 하려고 하는데 이와같이 사용할 수 있는 방법이 없을지 알고 싶습니다.

일단 아래 예제 코드 부터..

////////////////////////////////////////////////////////////////////////////////////
Class Test1{
public:
Test1(void)
{
printf("Test1 생성자 호출 \n");
}
};

Class Test2
{
public:
Test2(void)
{
printf("Test2 생성자 호출 \n" );
}
void func(void);

private:
Test1 t1; // Test1 클래스 형의 맴버 등록..
};

// 이곳에서 Test1 클래스의 객체를 생성 하고 싶습니다!
void Test2::func(void)
{
t1 = Test1(); //맴버 생성..
}

//////////////////////////////////////////////////////////////////////////////

대략 이런 경우 입니다.
Test2 내에 Test1형의 클래스 맴버를 선언 하게 되면, Test2 객체 생성시 생성자가 콜되면서 디폴트 생성자가 호출 되는 현상이 있습니다.

제가 원하는 것은 등록 만 해둔뒤 이후 Test2::func()에서 생성하기를 원합니다.
(포인터 타입으로 선언 후 new로 할당 하는 방법도 있지만 다른 방법이 없을까 해서 문의 드립니다.)

의견 부탁 드립니다.^.^

익명 사용자의 이미지

대부분의 경우 포인터를 쓰고 factory method로 생성하는 방법을 쓰거나 아니면 멤버(여기서는 t1)를 참조로 합니다.
참조로 했을 경우는 Test2 ctor에서 Test1의 객체 참조를 넘겨 주어야하니 조금 제약이 될수도 있겠네요.

그리고 한가지 추가하자면 외부에서 직접 객체 생성하는 것을 막고싶다면 ctor를 private으로 두는 것도 고려해볼만 합니다.

klara의 이미지

무슨 특별한 현상이 아니라 원래 그렇고, 그렇게 되는게 맞습니다.
객체의 생성과 동시에 초기화가 되는 것은 객체 지향의 기본입니다.
객체를 생성만 하고 초기화를 하지 않는다는 것은, 객체의 내부 구조를 객체의 외부에서 관리하겠다는 셈이니까요.
그런거에 특화된 특별한 관계의 클래스가 아닌한, 이런 사용법은 비정상적인 사용법입니다.
초기화를 늦추고 싶다면 객체 생성 자체를 늦춰야 하고, 그런 경우는 동적할당을 하면 되겠지요.
메모리 누수가 걱정이라면 소멸자에서 적절한 때에 해제해주거나 스마트 포인터를 쓰시면 되구요.

gilgil의 이미지

원하는 답변이 될지 모르겠지만 singleton, lazy initialization에 대해서 살펴 보시기 바랍니다.

http://www.gilgil.net/15751 singleton 클래스 이야기(1)
http://www.gilgil.net/15772 singleton 클래스 이야기(2)
http://www.gilgil.net/15792 singleton 클래스 이야기(3)
http://www.gilgil.net/15809 singleton 클래스 이야기(4)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.