• CSE207 객체지향 강좌 및 C++ 관련, 누구나 묻고 답하는 게시판 입니다.
  • CSE207 수강생이 아니여도 편안하게 질문하세요.
  • 첨부화일은 이미지 화일 혹은 zip 화일로 업로드 하기를 권합니다.

제목동적할당으로 생성한 객체의 배열 delete2019-05-13 01:57
작성자

안녕하세요 교수님. 동적할당으로 생성한 객체에 대한 동적배열의 delete 관련하여 질문이 있습니다.


Polygon class가 있고

그것을 상속받는 Triangle,Rectangle, Circle 클래스가 있습니다.

그리고 각각 넓이 및 둘레에 대한 함수를 오버라이딩하기도 하였습니다.


요점은 vector을 쓰지 않았을 때  

dynamic binding을 이용하려면 포인터로 객체를 가리켜야하잖아요.

그래서 new 를 통해 생성한 뒤 포인터로 받고 싶은데 그러기위해

Polygon 포인터의 배열을 생성했습니다 예를들어

Polygon * parr[3];


근데 이 parr에 대한 소멸을 시키려면

각 칸에 있는 포인터에대한 객체를 소멸시켜주고,

parr 배열 자체를 소멸시키면 되는 것 같은데 왜 안되는 지 모르겠네요.

(참고한 답변 : https://stackoverflow.com/questions/20303820/creation-of-dynamic-array-of-dynamic-objects-in-c
의 가장 위 답변 )



for (int i = 0; i < 3; i++)

{

delete[] parr[i];

}

//delete[] parr; //<<<<----이 줄이 안 됨...



전체 코드 올려봅니다

#include 
#include 
#include 
using namespace std;

class Polygon
{
protected:
	int number;
	float length;
public:
	Polygon() {}
	Polygon(int number, float length):number(number), length(length)
	{
		cout << number << "각형 생성" << endl;
	}
	virtual float getRound()
	{
		return number * length;
	}
	virtual float getArea() { cout << "ERROR : needs to be overriden" << endl; return -1; }

	void showInfo()	//유용하게 쓸 것임.
	{
		cout << "======================" << endl;
		cout << "NUMBER : " << number << endl;
		cout << "LENGTH : " << length << endl;
		cout << "ROUND : " << getRound() << endl;
		cout << "AREA : " << getArea() << endl;
		cout << "======================" << endl;
	}
};

class Triangle :public Polygon
{
public:
	Triangle(int number, float length) :Polygon(number, length)
	{	}
	//float getRound() override()	//여기선 override 할 필요가 읎어
	//override 붙이든 말든 오류 안 남
	float getArea() override { return length * length*sin(3.14 / 3) / 2; }
};

class Rectangle :public Polygon
{
public :
	Rectangle(int number, float length) :Polygon(number, length) {}
	//float getRound() override	//마찬가지 override 할 필요가 읎어
	float getArea() //여기선 override 안 붙여봄
	{
		return length * length;
	}
};

class Circle : public Polygon
{
public:
	Circle( float length) :Polygon(0, length) {}
	float getRound() override { return 2 * length*3.14; }	//이번엔 둘레도 override 해야돼!
	float getArea() { return length * length*3.14; }
};

int main()
{
	
	cout << "3각형 4각형 원에 대한 연산을 하는 프로그램을 작성해보겠습니다."<>>";
		cin >> number >> length;
		switch (number)
		{
		case 0: {
			parr[i] = new Circle(length);
			break;
		}
		case 3: {
			parr[i] = new Triangle(number, length);
			break;
		}
		case 4: {
			parr[i] = new Rectangle(number, length);
			break;
		}
		default: {
			cout << "ERROR : wrong input" << endl;
			i--;
			break;
		}
		}
	}

	//각 도형들의 정보를 출력해주는 부분
	//여기서 dynamic binding과 override의 효과를 볼 수 있다.
	for (int i = 0; i < 3; i++)
	{
		parr[i]->showInfo();
	}
	//소멸자부분은 잘 모르겠다...
	//스택오버플로상의 방법
	//https://stackoverflow.com/questions/20303820/creation-of-dynamic-array-of-dynamic-objects-in-c
	
	for (int i = 0; i < 3; i++)
	{
		delete[] parr[i];
	}
	//delete[] parr;	//<<<<----이 줄이 안 됨...
	
};>
댓글
이전배열 및 포인터의 delete 관련하여2019-05-14
다음const...2019-05-12