C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[52027] Re:Re:Re:Re:C++ 다중 상속시 복사 생성시 사용 방법
열씸! [cappuccino] 1329 읽음    2008-01-23 16:15
*this = *arg; 를 아직 이해하지 못하셨군요.

class A{
public:
int a;
};

class B: public A{
public:
int b;
};

하면 sizeof(B)는 8(byte)겠죠?

당연히
이경우 객체B의 *this 라는건, 8바이트 내용전체를(부모를 포함한) 의미합니다.
부모의 내용도 복사되죠.

= operator 오버로딩은 완전히 부가적인 부분으로 문제의 핵심과 벗어납니다.
건 표기를 clone으로 쓰느냐 연산자를 쓰느냐의 차이가 될 뿐이죠.

class A{
public:
int a;
    A(){a = 0;}
};

class B: public A{
public:
int b;
    B(){b = 0;}
void clone(B &arg){ *this = arg; } // 혹은 void clone(B *arg){ *this = *arg; }
};

이렇게 객체를 구성하시고

    B b1, b2;
    b2.a = 1;
    b2.b = 2;
    b1.clone(b2); // 포인터 전달의 경우엔 당연히 b1.clone(&b2);
    ShowMessage(b1.a);

해 보십시오. b2에 대입한 부모의 멤버 a의 내용인 1이
b1에서 깔끔하게 나오는걸 볼 수 있을겁니다.
나머지 문제들은 앞서의 글에 언급되어 있습니다. 다시한번 확인하세요.


문허니 님이 쓰신 글 :
: 답변 감사드립니다.
:
: 하지만, 이런 경우는 = operator 생성자를 해주어야 할것 같군요..
: 그리고, 제가 원하는 것은
:
: Gdi+::GrapihcsPath 를 상속받은 GrapihcsPath1이라는 클래스를 만드는 것이지요.
:
: Gdi+::GrapihcsPath의 내용은 알 수가 없는 상태이고,
: GrapihcsPath1에서 clone을 사용하고 싶다는 것입니다.
: 일단 클론을 하게 되면, GrapihcsPath1에 대한 멤버변수를 deep copy를 해야겠지요. 이것은
: 복사 생성자에서 할 수 있지만, 문제는 부모 클래스의 내용을 어떻게 복사하냐는 것입니다.
:
: 즉,
: GraphicsPath1::GraphicsPath1(const GraphicsPath1&)
:  {
:      // GraphicsPath1 멤버 변수 복사
:
:     // 상속한 GraphicsPath 복사
:  }
: 가 이루어져야 할 것 같은데,
: 상속된 GraphicsPath를 어떻게 복사하냐라는 것입니다.
:
: 그럼 답변 부탁드립니다. 꾸벅.
:
:
:
:
:
:
: 열씸! 님이 쓰신 글 :
: : 상속받은 클래스의 Constructor 에 Argument로 전달받은 내용을 할당하는 부분이 필요합니다.
: : GraphicsPath1::GraphicsPath1(GraphicsPath1 *arg){
: : *this = *arg;
: : }
: : 처럼 말이죠.
: : 이경우는 return new GraphicsPath1(*this); 가 아닌 return new GraphicsPath1(this);
: : 처럼 Clone에서 불러 주셔야 할테고
: : return new GraphicsPath1(*this); 로 받으시려면 뭐 *arg대신 arg를 쓰시면 되겠지만...
: : 내용이 많다면 스택을 이용해 많은 내용을 전달한다는게 오버헤드를 발생시키겠죠.
: :
: : 단, 클래스의 멤버중에 동적할당되거나 할당메모리의 포인터가 대입되는 멤버들이 있고,
: : 해당 자원이 인스턴스당 하나만 존재해야 할때는 주소만 복사되는 형태가 의미 없으므로,
: : 모든 동적할당코드를 Constructor안에 구현해 주셔야 합니다.
: : (그런 파트별 리소스들도 객체화 되어 있으면 조금 깔끔해 보이는 코딩이 될 수는 있죠.
: : 하지만 구현시간의 압박은 증가될겁니다. 템플릿으로 찍어내 버리면 조금 편해질 수도 있지만
: : 것도 제약사항들을 안고 있죠.)
: :
: : 김상면 님이 쓰신 글 :
: : : 질문의 요지가
: : :
: : : '생성자에서 상속받은 멤버의 초기화를 어떻게 하냐?' 이라면
: : :
: : : 대답은 간단합니다.
: : :
: : : '멤버 초기화 리스트를 사용하여라'
: : :
: : : 입니다.
: : :
: : :
: : :
: : :
: : :
: : : 문허니 님이 쓰신 글 :
: : : : 갑자기 복사생성자의 방법이 생각이 안나서 이렇게 글 씁니다.
: : : :
: : : : class GraphicsPath1 : public GrapihcsPath
: : : : {
: : : :     GraphicsPath1();
: : : :     GraphicsPath1(const GraphicsPath1&);
: : : :     ~GraphicsPath1();
: : : :
: : : :      GraphicsPath1* Clone();
: : : : };
: : : :
: : : : GraphicsPath1::GraphicsPath1(const GraphicsPath1&)
: : : : {
: : : :     // GraphicsPath1 속성 전달
: : : :    // ?? 상속한 GraphicsPath의 내용은 어떻게 복사하지요?
: : : : }
: : : :
: : : : GraphicsPath1* GraphicsPath1::Clone()
: : : : {
: : : :     return new GraphicsPath1(*this);
: : : : }
: : : :
: : : :
: : : : 대충 이렇게 되었을때, GraphicsPath를 상속받아서 사용하는데, GraphicsPath의 Clone을 하지 못하네요
: : : : 그래서 전달이 잘 안되는데, 어떻게 하면 상속한 GraphicsPath 내용도 Clone할 수 있는지요..

+ -

관련 글 리스트
51987 C++ 다중 상속시 복사 생성시 사용 방법 문허니 1092 2008/01/21
51988     Re:C++ 다중 상속시 복사 생성시 사용 방법 김상면 1006 2008/01/22
51992         Re:Re:C++ 다중 상속시 복사 생성시 사용 방법 열씸! 1173 2008/01/22
52018             Re:Re:Re:C++ 다중 상속시 복사 생성시 사용 방법 문허니 1617 2008/01/22
52027                 Re:Re:Re:Re:C++ 다중 상속시 복사 생성시 사용 방법 열씸! 1329 2008/01/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.