[완료]VC++와 Eclipse CDT (MinGW) 에러나는게 다른데 정상인가요?
글쓴이: yuiangel / 작성시간: 금, 2008/07/18 - 4:14오후
#include <iostream> using namespace std; // 기본 클래스 class Polygon { protected: int m_h; int m_b; public: Polygon( int _h=0, int _b=0 ) : m_h(_h), m_b(_b) { cout << "Polygon 생성됨\n"; } virtual void ShowArea() { cout << "Area:Polygon" << endl; } }; // Polygon을 상속받는 사각형 class Rectangle : public Polygon { public: Rectangle( int _h, int _b ) : Polygon( _h, _b ) { //---> 1번 cout << "Rectangle 생성됨\n"; } void ShowArea() { cout << "Area:Rectangle=" << m_h*m_b<< endl; } }; // 삼각형 class Triangle : public Polygon { public: Triangle( int _h, int _b ) : Polygon( _h, _b ) { cout << "Triangle 생성됨\n"; } void ShowArea() { cout << "Area:Triangle=" << (m_h*m_b)/2 << endl; } }; int main(){ Polygon *P=NULL; //----> 2번 Rectangle o_R( 2, 4 ); Triangle o_T( 3, 5 ); P = &o_R; (*P).ShowArea(); P = &o_T; P->ShowArea(); delete P; //-----> 2번 return 0; }
상속을 배우면서 virtual이 왜 필요한지의 예제를 돌리는데
옆에 친구의 VC++과 결과가 달라서 당황스럽습니다.
1번 부분에서 Polygon의 생성자에 값을 줘보낼때
Polygon::Polygon( ~
라고 적으면 이클립스는 오류가 안나고 VC++은 컴파일 오류가 납니다.
2번 부분을
Polygon *P = new Polygon; 이거나,
Polygon *P = NULL; 이걸로해도 (어느것이 맞는지는 모르겠습니다 헷갈려요 ㅜㅜ)
이클립스에선 아무 오류없이 잘 돌아가고 VC++은 런타임 오류가 납니다(결과는 나오구요)
어느 장단에 맞춰야할지 모르겠습니다 ..
이클립스 설치에서 뭔가를 잘못 한걸까요?
긴글 읽어주셔서 감사합니다.
Forums:
컴파일 오류가 나면
컴파일 오류가 나면 그 오류내용을 적으세요.
2번은 어디에도 장단을 맞추면 안됩니다.
delete하는건 new로 할당한 포인터에만 이용해야합니다.
new로 할당하지 않은 어떤 경우도(malloc으로 할당한경우조차도) delete를 이용하는건 어떠한 결과도 보장하지 않습니다.
여기선 동적할당하는 부분이 없으므로, 두번째2번의 delete 는 필요없습니다.
그리고 첫번째 1번에서 new로 할당할 필요도 없습니다. 본문에 적힌대로 널포인터정도로 초기화시켜주는게 적당하겠죠.
여기서 할당한 객체는 쓰이지 않고, 곧바로 이 포인터는 전혀 다른 객체를 가리키게 되니까요.
xylosper님 매번 고맙습니다 ㅜㅜ
어제도 도움받았는데 오늘도 귀중한 답변 정말 감사합니다 ㅜㅜ
컴파일 오류는 1번 부분인
Rectangle( int _h, int _b ) : Polygon( _h, _b ) {
이것을
Rectangle( int _h, int _b ) : Polygon::Polygon( _h, _b ) {
이렇게 썼을때 VC++에서 "('ctor')Polygon의 멤버가 아닙니다" 라는 오류가 나옵니다.
Polygon생성자는 정의해두었는데 멤버가 아니라고 하네요;
감사합니다.
후자가 표준인지
후자가 표준인지 아닌지는 잘 모르겠네요.
저같은 경우는 후자로 적어본적이 한번도 없습니다.
전자가 일반적인경우라고 생각되니, 전자로 코딩하시고, 정확한게 알고 싶으시다면 표준을 뒤져봐야겠네요.
그리고 설사 표준에서 후자가 인정되는 방법이라고해도 사용하시는 컴파일러에서 표준을지원하지 않는다면 거기에 맞출수밖에 없겠죠.
xylosper님 정말 고맙습니다
매번 정말 큰 도움을 받고있습니다!
좋은 주말 보내시길 바랄게요~! 감사합니다.
댓글 달기