|
*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할 수 있는지요..
|