클래스의 멤버로서 포인터 멤버를 가질 경우에 질문좀여!

creatorJinsang의 이미지

class Room{
private:
        Place* place;
public:
        Room(const int& size);
};
 
Room::Room(const int& size){
	place = new Place[size];	
}

위와 같이 Room 클래스의 복사 생성자를 형성해서 넘어오는 인자 만큼 배열을 동적할당해주려고 합니다.
Room 클래스의 멤버 포인터 place를 이용하여 place 클래스의 성분에 대해 작업을 하려고 하는데, 초보자인 제 눈에도 여간 꺼림칙하네요;;

1. 저렇게 생성자 내에서 클래스 멤버 포인터를 동적할당할 경우, 일단 예외가 발생하지않는다면 메모리가 떠버리는 일은 없다고 생각하는데, 그렇다고 해도 저렇게 방치해도 될까요??

2. 클래스 내부의 멤버로서 포인터를 가질경우, 캡슐화가 적용되지 않는다고 봐도 무방한가요? 포인터 멤버를 갖는다면 그건 다른 클래스에 대한 핸들을 가진다고 봐도 되나요?

이상 NewB의 질문이었습니다 T_T 답변좀 부탁드릴게요 Please~

philnet의 이미지

먼저, 작성하신 코드는 복사 생성자가 아니라, 단순히 const int& 를 인자로 받는 생성자입니다. 참고로 어떤 class의 복사 생성자의 시그니쳐는 X::X(const X& a_x) 여야 합니다. 또한, 복사 생성자라면, 복사에 의해 생성된 객체가, 인자로 넘어온 객체와 동일한 상태를 가지도록 하는 복사 작업이 필요할 것입니다.

1. 생성자에서 동적 할당된 메모리를, 적절하게 소멸자에서 해제해 주어야 합니다. 만약 Place를 생성하는 과정에서 발생할 수 있는 예외까지 고려한다면, 훨씬 많은 고민이 필요합니다. (그리고 특별한 상황이 아니라면 배열보다는 vector와 같은 표준 C++ 라이브러리 컨테이너를 사용하는 것이 좋을 겁니다.)
2. 작성하신 코드의 경우, (제대로 된 생성자, 복사 생성자 및 할당 연산자를 구현한다는 전제 하에) 포인터 변수를 동적 할당해서 배타적으로 쓸 것으로 '추정' 됩니다. place는 private이고, place를 반환하는 public 함수가 없기 때문에 캡슐화에는 문제가 없다고 봐도 될 것 같네요. (만약 place가 pulbic이거나 혹은 이를 반환하는 public 함수가 있다면, 외부에서 Room 객체의 포인터를 가지고 잘못 사용할 수 있기 때문에 좋지 않다라는 겁니다.)

전반적으로 C++ 및 C++의 객체 지향 개념에 대해 부족한 것 같습니다. 동적 할당되는, 포인터 타입의 멤버 변수를 가지는 C++ class는 작성할 때 신경써 줘야 하는 것이 제법 많습니다. 또한 좋은 interface를 가지는 class의 설계는 더 많은 고민과 경험이 필요할 것입니다.

일단은 좋은 책들을 읽으실 것을 권해 드리고요, Effective C++ 3판의 정독을 추천합니다.

댓글 달기

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