|
백수 님이 쓰신 글 :
: 한가지 아는 부분 있길래 씁니다.
: 아래 코드 중
:
: TButton *C = new TButton(*B); //not allowed!!
:
: 는 다음과 같이 쓰면 가능합니다.
:
: TButton *C = new TButton(B);
:
: VCL은 선언 및 연결에서 반드시 포인터를 사용하도록 되어있지요.
: 물론 화면상에 나타나게 하려면 별도로 Parent를 지정해야 합니다.
: 다 아는 얘기시라구요.. -_-
:
: 그래도 또 하나..
: 위의 코드에서
:
: C->Parent = B
:
: 라고 하면 C는 B를 따라다닙니다.
:
: 그냥 재미죠..
:
:
:
:
: 백수 님이 쓰신 글 :
: : 안녕하세요?
: : 오랜말에 글을 올려보는군요.
: : 항상 자주 오지만 오늘 글을 올립니다.
: : 씨++ 빌더의 사용자 가이드를 읽고 궁금해진것이 생겼습니다.
: : 우선 아래의 소스코드를 보아주세요
: :
: : TButton *B = new TButton(ownerCtrl);
: : TButton *C = new TButton(*B); //not allowed!!
: :
: : 위와 같은 구문은 VCL-style 에서는 허락되지 않는다고
: : 나왔습니다.
: : 저도 VCL을 공부하고 있지만 왜 저위에것이 허락되지 않는지
: : 궁금합니다.
: :
: : 또한가지 이것은 C++에서입니다.
: : MyClass *p = new MyClass;
: : MyClass *q = new MyClass;
: : *p = *q;
: :
: : 위의 할당이 적법한것이 알고싶어요.
: : 그리고 만약 적법하다면 가상생성자는 어떻게 생성되는지도
: : 알고싶습니다.
: :
: : 그럼 답변을 애타게 기다리며,, 글을 올립니다
:
:
: 임프님 다시한번 올립니다.
: 위의 TButton *C = new TButton(*B); //not allowed!!
: 이것의 형태가 왜 허락이 되지 않은지 가르쳐주세요.
:
:
: 요즘 너무 힘듭니다. 학교에 들어가긴했지만, 궁금한것이
: 있어도 가르쳐주는 사람이 없어서 무척실망입니다..
: 교수님에게 편지를 보냈지만, 답장도 없네요.
: 부디 임프님만은 절 실망시켜주지 마세요..
임펠리테리입니다.
TButton *B = new TButton(ownerCtrl);
TButton *C = new TButton(*B); //not allowed!!
이게 왜 안되느냐구요? 간단하죠. TControl의 생성자에 넘겨지는 인자, 즉 Owner가 원래 TComponent *형이기 때문입니다. 그 이하로 TComponent 에서 상속을 받는 TControl이나 TWinControl 등등도 모두 동일하게 Owner로서 TComponent * 형의 인자를 받습니다.
간단히 말하면, "함수(생성자)의 선언이 그렇게 되어있으니 다 그렇게 써야 된다"라고.. 문법적으로는 그렇게 설명할 수 있겠죠.
생성자의 인자인 Owner를 이렇게 선언해놓은 데는 물론 이유가 있습니다. Owner의 역할이 있기 때문이죠. Owner는 Owner 자신이 파괴될 때 자신을 Owner로서 설정해놓은 모든 컴퍼넌트들을 몽땅 끌고 동반자살하는 역할을 합니다. 예를 들어서,
TPanel *MyPanel = new TPanel(this);
만약 이 코드가 폼 클래스의 함수에 있다면 this는 그 폼에 대한 포인터가 되겠지요? 이 경우에는, 별도로 이 MyPanel을 delete 해주지 않더라도 this인 폼이 파괴될 때 MyPanel도 함께 파괴됩니다. 이것이 Owner로 지정된 컴퍼넌트의 역할입니다.
아마도 님께서는 일반적인 클래스의 객체 자체를 대입하는 생성자의 역할과, vcl에서의 생성자의 역활과를 혼동하신 거 같습니다. 일반적으로 클래스의 객체 자체(포인터가 아닌)를 대입하는 연산을 하게 되면, 보통은 생성자 내부에서 넘겨진 객체의 멤버들의 값으로 현재 생성중인 클래스의 멤버들의 값을 같게 세팅하는 역할을 하도록 만들죠. 물론 그렇게 하고 말고는 프로그래머의 맘입니다.
그럼 참고하시길...
|