[완료]VC++와 Eclipse CDT (MinGW) 에러나는게 다른데 정상인가요?

yuiangel의 이미지

#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++은 런타임 오류가 납니다(결과는 나오구요)

어느 장단에 맞춰야할지 모르겠습니다 ..
이클립스 설치에서 뭔가를 잘못 한걸까요?

긴글 읽어주셔서 감사합니다.

klara의 이미지

컴파일 오류가 나면 그 오류내용을 적으세요.
2번은 어디에도 장단을 맞추면 안됩니다.
delete하는건 new로 할당한 포인터에만 이용해야합니다.
new로 할당하지 않은 어떤 경우도(malloc으로 할당한경우조차도) delete를 이용하는건 어떠한 결과도 보장하지 않습니다.
여기선 동적할당하는 부분이 없으므로, 두번째2번의 delete 는 필요없습니다.
그리고 첫번째 1번에서 new로 할당할 필요도 없습니다. 본문에 적힌대로 널포인터정도로 초기화시켜주는게 적당하겠죠.
여기서 할당한 객체는 쓰이지 않고, 곧바로 이 포인터는 전혀 다른 객체를 가리키게 되니까요.

yuiangel의 이미지

어제도 도움받았는데 오늘도 귀중한 답변 정말 감사합니다 ㅜㅜ
컴파일 오류는 1번 부분인

Rectangle( int _h, int _b ) : Polygon( _h, _b ) {

이것을

Rectangle( int _h, int _b ) : Polygon::Polygon( _h, _b ) {

이렇게 썼을때 VC++에서 "('ctor')Polygon의 멤버가 아닙니다" 라는 오류가 나옵니다.
Polygon생성자는 정의해두었는데 멤버가 아니라고 하네요;
감사합니다.

klara의 이미지

후자가 표준인지 아닌지는 잘 모르겠네요.
저같은 경우는 후자로 적어본적이 한번도 없습니다.
전자가 일반적인경우라고 생각되니, 전자로 코딩하시고, 정확한게 알고 싶으시다면 표준을 뒤져봐야겠네요.
그리고 설사 표준에서 후자가 인정되는 방법이라고해도 사용하시는 컴파일러에서 표준을지원하지 않는다면 거기에 맞출수밖에 없겠죠.

yuiangel의 이미지

매번 정말 큰 도움을 받고있습니다!
좋은 주말 보내시길 바랄게요~! 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.