[완료] C++ 에서 생성자 관련 질문입니다..
글쓴이: anster / 작성시간: 수, 2010/04/14 - 2:30오후
안녕하세요~ C++ 공부중에 생성자때문에 질문 드립니다. ^^; 아래는 소스입니다..
class AAA { private: char* name1; public: AAA(const char* _name1) { name1 = new char[strlen(_name1)+1]; strcpy(name1, _name1); cout<<"ctor AAA call"<<endl; } virtual ~AAA() { delete[] name1; cout<<"dtor AAA call"<<endl; } virtual const char* retName(void) const { return name1; } }; class BBB : public AAA { private: char* name2; public: BBB(const char* _name1, const char* _name2) { name2 = new char[strlen(_name2)+1]; strcpy(name2, _name2); AAA(_name1); cout<<"ctor BBB call"<<endl; } ~BBB() { delete[] name2; cout<<"dtor BBB call"<<endl; } const char* retName(void) const { return name2; } };
제가 궁금한것은
이중에서 Class B의 생성자 부분에 보면 AAA(_name1); 다음과 같은 문장이 있는데
이부분때문에 자꾸 다음과 같은 에러가 납니다.
Error 2 error C2512: 'AAA' : no appropriate default constructor available
적절한 기본 생성자가 없다는 이야기인데, 저는 인자로 char* 주었고, AAA에도 합당한 생성자가 있는데
왜 기본 생성자를 찾는것인지 잘 모르겠습니다 ^^;
이부분을 다음과 같이 이니셜라이져를 이용해서 고치면 컴파일이 되는데 그러한 이유도 잘 모르겠습니다..ㅠ_ㅠ
BBB(const char* _name1, const char* _name2) : AAA(_name1) { name2 = new char[strlen(_name2)+1]; strcpy(name2, _name2); cout<<"ctor BBB call"<<endl; }
읽어주셔서 감사합니다..
Forums:
그것은
C++에서 상속받은 상위 클래스를 초기화하는 방법은, 이미 아시는 것처럼 initialization-list에서 상위 클래스 타입 이름을 써서 합니다. 두번째 코드처럼 하는 것이 맞지요. 다만 첫번째 예제에서 에러가 나는 것은, BBB 생성자 본문 중의
이 부분 때문에 에러가 나는 것이 아니고, BBB의 initialization list 중에서 적절한 AAA의 호출자를 찾을 수 없기 때문에 나는 것입니다. 즉, 두번째 코드의
처럼 initialization list에서 explicit하게 상위클래스의 생성자를 호출하지 않으면, 컴파일러는 implicit하게
라는 default constructor를 호출하게 됩니다. 즉, 마치 BBB의 생성자가
처럼 되어 있는 효과를 내는 것이죠. 그러나 AAA에는 저렇게 호출될 수 있는 default constructor가 정의되어있지 않으므로,
라는 에러가 발생하는 것입니다.
참고로 BBB 생성자 본문 중의
이 부분은, 아마도 의도와는 다른 작용을 할 것입니다. 그것은 AAA타입의 (이름없는) 임시객체를 문맥 상에(아마도 스택에, 혹은 레지스터에) 잠깐 생성했다가 곧바로 삭제하는 효과를 냅니다. 다음과 같은 예를 고려해보세요:
아..^^;
아..생성자를 호출하는것이 아니라 그냥 임시 객체 생성 수 바로 소멸로 해석될 수도 있겠군요.. ㅠ_ㅠ 친절한 답변 감사드립니다. 앞으로 상위 클래스는 명심해서 이니셜라이저를 이용해서 초기화 하겠습니다 ^^;; 감사합니다
===================
복군의 이글루
http://anster.egloos.com
댓글 달기