C++ 문법에 관해 질문할것이 있습니다.

코드 과제를 하는도중 이해가 가지 않는 부분이 있어서 글 올립니다.
교수님께서 작성하신 코드를 바탕으로 추가하는 방식의 과제라 코드를 함부로 건들지
못합니다…

int main(void)
{
	Ellipse(1, 2), Rectangle(3, 4), Triangle(5, 6);
	Sphere(7, 8, 9), Cube(10, 11, 12), Cylinder(13, 14, 15);


	for (int i = 0; i < 3; i++)
	{
		printShape();
		printShape();
	}
	system("pause");
	return 0;
}

이 메인문 안에서 Ellipse(1, 2), Rectangle(3, 4), Triangle(5, 6); 이 부분이 이해가 잘 안갑니다… 객체를 만드는 것도 아닌데 왜 이런 코드가 있는지 아시는 분 계시면 알려주세요…
코드 전문은 아래에 있습니다.

#include <iostream>
#include <string>
#define PI 3.141592

using namespace std;

class Shape
{
protected:
	int width;
	int height;

public:
	Shape(int width, int height);
	void setWidth(int width);
	void setHeight(int height);

	virtual void printShape() = 0;
};
Shape::Shape(int width, int height) {
	setWidth(width);
	setHeight(height);
}
void Shape::setWidth(int width) {
	this->width = width;
}
void Shape::setHeight(int height) {
	this->height = height;
}


class TwoDimShape : public Shape
{
private:
	int area;
public:
	TwoDimShape(int w, int h) :Shape(w, h) {};
	void printShape() {
		cout << "2차원 도형 면적:" << getArea() << endl;
	}
	double getArea();
};
double TwoDimShape::getArea() {
	return area;
}
class Rectangle : public TwoDimShape
{
	// 사각형 클래스에 추가 멤버변수 없음!
public:

	Rectangle(int w, int h) :TwoDimShape(w, h) {};
	double getArea()
	{
		return width * height;
	}

	virtual void printShape() {
		cout << "Rectangle 면적 : " << getArea() << endl;
	}
};

class Ellipse : public TwoDimShape
{
	// 타원 클래스에 추가 멤버변수 없음!
public:
	// 여기에 타원 클래스의 생성자와 멤버함수 정의
	Ellipse(int w, int h) :TwoDimShape(w, h) {};
	double getArea()
	{
		return width * height * PI / 4;
	}

	virtual void printShape() {
		cout << "Ellipse 면적 : " << getArea() << endl;
	}
};

class Triangle : public TwoDimShape
{
	// 삼각형 클래스에 추가 멤버변수 없음!
public:
	// 여기에 삼각형 클래스의 생성자와 멤버함수 정의
	Triangle(int w, int h) :TwoDimShape(w, h) {};
	double getArea()
	{
		return width * height / 2;
	}

	virtual void printShape() {
		cout << "Triangle 면적 : " << getArea() << endl;
	}
};

class ThreeDimShape : public Shape
{
private:
	int volume;
public:
	ThreeDimShape(int w, int h) :Shape(w, h) {};
	void printShape() {
		cout << "3차원 도형 면적:" << getVolume() << endl;
	}
	double getVolume();
	// 여기에 3차원도형 클래스의 생성자와 멤버함수들 정의
};

double ThreeDimShape::getVolume() {
	return volume;
}



class Sphere : public ThreeDimShape
{
private:
	int radius;
public:
	// 여기에 구 클래스의 생성자와 멤버함수 정의
	Sphere(int w, int h, int r) : ThreeDimShape(w, h) {
		setRadius(r);
	}
	void setRadius(int radius) {
		this->radius = radius;
	}

	double getVolume()
	{
		return ((double)3 / 4) * radius * radius * radius * PI;
	}

	virtual void printShape() {
		cout << "Sphere 체적 : " << getVolume() << endl;
	}
};

class Cube : public ThreeDimShape
{
private:
	int base;
public:
	// 여기에 육면체 클래스의 생성자와 멤버함수 정의
	Cube(int w, int h, int b) :ThreeDimShape(w, h) {
		setbase(b);
	}
	void setbase(int base) {
		this->base = base;
	}

	double getVolume()
	{
		return width * height * base;
	}

	virtual void printShape() {
		cout << "Cube 체적 : " << getVolume() << endl;
	}
};

class Cylinder : public ThreeDimShape
{
private:
	int radius;
public:
	// 여기에 원통 클래스의 생성자와 멤버함수 정의
	Cylinder(int w, int h, int r) :ThreeDimShape(w, h)
	{
		setRadius(r);
	}
	void setRadius(int radius) {
		this->radius = radius;
	}

	double getVolume()
	{
		return radius * radius * PI * height;
	}
	virtual void printShape() {
		cout << "Cylinder 체적 : " << getVolume() << endl;
	}

};

void printShape()
{

	
}

int main(void)
{
	Ellipse(1, 2), Rectangle(3, 4), Triangle(5, 6);
	Sphere(7, 8, 9), Cube(10, 11, 12), Cylinder(13, 14, 15);


	for (int i = 0; i < 3; i++)
	{
		printShape();
		printShape();
	}
	system("pause");
	return 0;
}

안녕하세요

main함수의 그 코드는 객체의 생성자들을 불러 객체를 생성하는 겁니다. 다만 저장을 하지 않을 뿐이죠.
일종의 예시인거 같기도하고

교수님이 내준 문제는 무엇인가요? ^^


이 과제입니다.
제가 올린 main문은 손을 대지 않은 상태입니다.
질문드린 그 부분이 생소해서 코드 진행이 되질 않네요;;

클래스 선언은 다 되어있지만 printShape 함수와 main 함수가 pseudo code 느낌이네요.
해당 코드에서 지우지 않고 추가만 해야하는 것이면 상당히 고민해야겠네요

tuple쓰면 그 어떤것도 안지우고 추가만으로 가능하네요!

생성자만 존재하는 부분은 어떠한 메모리에 해당 생성된 클래스들을 몰아서 저장해두고 꺼낸다 라는 개념으로 접근하시는게 좋겠네요. 그러면 생성자를 호출하여 어떠한 배열형태의 메모리에 해당 클래스들이 element로 저장될테니 꺼내쓸 수 있겠죠?

다중 타입을 저장할 수 있는 형태를 생각해보시는 것이 좋은 힌트가 될 것 같습니다!

흐음 먼가 거의 다 되어있는거 같… ㅎㅎㅎ

아하 주석을 보면서 빠진 코드를 채워넣는건가 보네용
일단 main부분은 무시하시고 빠진코드를 채워넣으신다음에
main함수에서 객체 생성해서 getVolume() 호출하시면 각도형의 부피가 나올거 같네요 ㅎㅎㅎ

getVolume()을 안해도 그냥 해당 클래스의 printShape()만 해도 저렇게 나오네요

아하 그렇네요 더 좋은 메소드가 있었네용 ㅎㅎㅎ

아 감사합니다!

약간 부연 설명을 하면 코드를 수정하면 안 된다는 게, Statement 단위를 말하는 게 아닌 것 같네요.

다음과 같은 코드가 있다고 하면,

Triangle(), Rectangle();

다음과 같이 수정할 수 있다는 걸까요.

Shape triangle = Triangle(), rectangle = Rectangle();

약간 힌트를 드리자면 출력문이 3 * 2인 걸로 볼 때, 2D와 3D로 구분해서 배열로 정의하고 Initializer List 같은 걸 쓰라는 것 같아요.

다시 말해,

TDS* tds[] = { new E(), new R(), new T() };
1 Like