반응형
c++를 공부하기 시작했다. 객체지향 설계를 중점으로 공부하며 진행했다.
Media클래스에서 파생된 미디어들의 제목과 내용을 바탕으로 한 간단한 랜덤 퀴즈 프로그램을 만들었다.
Base가 되는 MediaInfo 클래스
더보기
MediaInfo
#ifndef MEDIAINFO_H
#define MEDIAINFO_H
#include<iostream>
#include<string>
using namespace std;
enum EMediaType
{
AUDIO = 1,
MOVIE
};
class MediaInfo {
protected:
string title;
public:
EMediaType mediaType;
MediaInfo();
MediaInfo(string title);
virtual string GetTitle();
};
#endif
///////////////////////////////////////////////////////////////////////////////////////////////
#include "Quiz.h"
#include "MovieInfo.h"
#include "AudioInfo.h"
Quiz::Quiz() {
mediaVector.clear();
MediaInfo* mediaInfo[6] = {
new MovieInfo("신세계", "죽기 딱 좋은 날씨네"),
new MovieInfo("타짜", "묻고 더블로 가"),
new MovieInfo("명량", "전하, 신에게는 아직 12척의 배가 남아있사옵니다"),
new AudioInfo("리무진", "비오"),
new AudioInfo("사건의 지평선", "윤하"),
new AudioInfo("흔들리는 꽃들 속 에서 네 샴푸 향이 느껴진 거야", "장범준")
};
for (int i = 0; i < 6; i++) {
InitVector(mediaInfo[i]);
}
}
void Quiz::InitVector(MediaInfo*& mediaInfo) {
mediaVector.push_back(mediaInfo);
}
void Quiz::Play() {
srand((unsigned int)time(NULL));
string userInput;
int randomIndex = rand() % mediaVector.size();
if (mediaVector[randomIndex]->mediaType == EMediaType::AUDIO)
cout << "제목 : " << mediaVector[randomIndex]->GetTitle() << " / 노래를 부른 가수는?" << endl;
else if (mediaVector[randomIndex]->mediaType == EMediaType::MOVIE)
cout << "명대사 : " << static_cast<MovieInfo*>(mediaVector[randomIndex])->GetQuotes() << " / 영화의 제목은?" << endl;
else
cout << "에러!";
getline(cin, userInput);
if (mediaVector[randomIndex]->mediaType == EMediaType::AUDIO &&
static_cast<AudioInfo*>(mediaVector[randomIndex])->GetSinger() == userInput)
cout << "정답!" << endl;
else if (mediaVector[randomIndex]->mediaType == EMediaType::MOVIE &&
mediaVector[randomIndex]->GetTitle() == userInput)
cout << "정답!" << endl;
else
cout << "오답!" << endl;
}
파생 클래스들
더보기
MovieInfo
#ifndef MOVIEINFO_H
#define MOVIEINFO_H
#include<iostream>
#include<string>
#include "MediaInfo.h"
#include "AudioInfo.h"
using namespace std;
class MovieInfo : public MediaInfo{
string quotes;
public:
MovieInfo();
MovieInfo(string title, string quotes);
virtual string GetTitle();
string GetQuotes();
};
#endif
////////////////////////////////////////////////////////////////////////////////////////////////
#include "MovieInfo.h"
MovieInfo::MovieInfo() {
quotes = "";
mediaType = EMediaType::MOVIE;
}
MovieInfo::MovieInfo(string title, string quotes) {
this->quotes = quotes;
this->title = title;
mediaType = EMediaType::MOVIE;
}
string MovieInfo::GetTitle() {
return title;
}
string MovieInfo::GetQuotes() {
return quotes;
}
AudioInfo
#ifndef AUDIOINFO_H
#define AUDIOINFO_H
#include<iostream>
#include<string>
#include "MediaInfo.h"
using namespace std;
class AudioInfo : public MediaInfo {
string singer;
public:
AudioInfo();
AudioInfo(string title, string singer);
virtual string GetTitle();
string GetSinger();
};
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////
#include "AudioInfo.h"
AudioInfo::AudioInfo() {
singer = "";
mediaType = EMediaType::AUDIO;
}
AudioInfo::AudioInfo(string title, string singer) {
this->singer = singer;
this->title = title;
mediaType = EMediaType::AUDIO;
}
string AudioInfo::GetTitle() {
return title;
}
string AudioInfo::GetSinger() {
return singer;
}
최종적으로 퀴즈 진행을 담당하는 Quiz 클래스를 만들었다.
#ifndef QUIZ_H
#define QUIZ_H
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <ctime>
#include "MediaInfo.h"
using namespace std;
class Quiz {
vector<MediaInfo*> mediaVector;
public:
Quiz();
void InitVector(MediaInfo*& mediaInfo);
void Play();
};
#endif
-----------------------------------------------------------------------------------------------------
#include "Quiz.h"
#include "MovieInfo.h"
#include "AudioInfo.h"
Quiz::Quiz() {
mediaVector.clear();
MediaInfo* mediaInfo[6] = {
new MovieInfo("신세계", "죽기 딱 좋은 날씨네"),
new MovieInfo("타짜", "묻고 더블로 가"),
new MovieInfo("명량", "전하, 신에게는 아직 12척의 배가 남아있사옵니다"),
new AudioInfo("리무진", "비오"),
new AudioInfo("사건의 지평선", "윤하"),
new AudioInfo("흔들리는 꽃들 속 에서 네 샴푸 향이 느껴진 거야", "장범준")
};
for (int i = 0; i < 6; i++) {
InitVector(mediaInfo[i]);
}
}
void Quiz::InitVector(MediaInfo*& mediaInfo) {
mediaVector.push_back(mediaInfo);
}
void Quiz::Play() {
srand((unsigned int)time(NULL));
string userInput;
int randomIndex = rand() % mediaVector.size();
if (mediaVector[randomIndex]->mediaType == EMediaType::AUDIO)
cout << "제목 : " << mediaVector[randomIndex]->GetTitle() << " / 노래를 부른 가수는?" << endl;
else if (mediaVector[randomIndex]->mediaType == EMediaType::MOVIE)
cout << "명대사 : " << static_cast<MovieInfo*>(mediaVector[randomIndex])->GetQuotes() << " / 영화의 제목은?" << endl;
else
cout << "에러!";
getline(cin, userInput);
if (mediaVector[randomIndex]->mediaType == EMediaType::AUDIO &&
static_cast<AudioInfo*>(mediaVector[randomIndex])->GetSinger() == userInput)
cout << "정답!" << endl;
else if (mediaVector[randomIndex]->mediaType == EMediaType::MOVIE &&
mediaVector[randomIndex]->GetTitle() == userInput)
cout << "정답!" << endl;
else
cout << "오답!" << endl;
}
5년전에 기초만 배우고, 게임개발을 위해 c#으로 넘어와 유니티만 만졌는데 최근 부족함을 느끼고 객체지향의 기본으로 돌아가기로 했다.
객체지향 프로그래머에게 가장 중요한 것은 클래스 설계를 얼마나 잘하는가에 달려있는 것 같다.
반응형