<main.cpp>
#include <iostream>
#include "dog.h"
#include "dogschool.h"
int main(){
/*
Dog *d1, *d2;
d1 = new Dog("철수");
d2 = new Dog("영이");
d1->speak();
d2->speak();
DogSchool * ds = new DogSchool("명지 애견학교");
ds->RegisterDog(d1); // d1을 애견학교에 등록시킨다.
ds->RegisterDog(d2); // d2을 애견학교에 등록시킨다.
ds->ShowDogs(); */
Dog *d1, *d2;
d1 = new Dog("철수");
d2 = new Dog("영이");
DogSchool * ds = new DogSchool("명지 애견학교");
ds->RegisterDog(d1); // d1을 애견학교에 등록시킨다.
ds->RegisterDog(d2); // d2을 애견학교에 등록시킨다.
ds->RegisterDog(new Dog("똘이"));
ds->ShowDogs(); // 학교에 있는 개들을 전부 짖게 한다.
d1->DropSchool(); // 철수를 자퇴시킨다.
ds->ShowDogs(); //
d2->SetName("Snoopy"); // 영이의 이름을 Snoopy로 바꾼다.
ds->SetName("MJ Canine School"); // 학교 이름을 바꾼다.
ds->ShowDogs(); // 바뀐 이름이 반영되어야 한다.
}
<dog.cpp>
#include <iostream>
#include "dog.h"
#include "dogschool.h"
Dog::Dog(){
// Default 생성자
}
Dog::Dog(std::string name){
this->name_= name;
}
void Dog::speak(){
std::cout<<"멍멍, 나는 "<<name_<<"입니다.";
if(my_school_!=0)
std::cout<<"나는 "<<my_school_->getName()<<"에 다닙니다.\n";
else
std::cout<<"학교에 안다님.\n";
}
std::string Dog:: getName(){
return name_;
}
void Dog::setSchool(DogSchool *ds){
my_school_= ds;
}
void Dog::SetName(std::string n){
name_=n;
}
void Dog::DropSchool(){
my_school_->DropSchool_tmp();
}
<dogschool.cpp>
#include <iostream>
#include "dogschool.h"
#include "dog.h"
DogSchool::DogSchool(){
// Default 생성자
}
DogSchool::DogSchool(const char *name){
name_ =name;
}
void DogSchool::ShowDogs(){
std::cout<<"여기는 "<<name_<<"입니다.\n";
std::cout<<"학생들을 소개합니다.\n";
for(int i=0; i<numDogs_; i++){
//std::cout<<"멍멍, 나는 "<<dogs_[i]->getName()<<"입니다.";
//std::cout<<"나는 "<<name_<<"에 다닙니다.\n";
dogs_[i]->speak();
}
}
void DogSchool::RegisterDog(Dog *d){
dogs_[numDogs_]= d;
numDogs_++;
d->setSchool(this); //this가 바로 학교의 주소.멍멍아 너도 등록해라~
}
std::string DogSchool::getName(){
return name_;
}
void DogSchool::SetName(std::string n){
name_=n;
}
void DogSchool::DropSchool_tmp(){
dogs_[0] = NULL;
//dogs_[0]->speak() = NULL; ???
numDogs_--;
for(int i=0;i<numDogs_;i++){
dogs_[i]=dogs_[i+1];
}
}
//dogs_[0]의 포인터 연결 해제시키고 0을 가리키도록.
//num_dogs_ 하나 줄이고.
//[0]자리를 메꾸기 위해 3/2/1->2/1/0 으로 재조정해야됨.
<dog.h>
#ifndef _DOG_H_
#define _DOG_H_
#include <string>
#define MAX_DOGS 100
class DogSchool;
class Dog {
public:
Dog(); // 기본 생성자.
Dog(std::string name);
void speak();
std::string getName();
void setSchool(DogSchool *ds); //마찬가지로 포인터니까 클래스 선언만 해도 됨.
void SetName(std::string n);
void DropSchool();
// 멤버 변수 및 비공개 함수
private:
std::string name_;
DogSchool *my_school_ =nullptr; //nullptr: 포인터타입의 0
//int numDogs_=0;
//Dog *dogs_[MAX_DOGS];
Dog *myschool;
};
#endif
<dogschool.h>
#ifndef _DOGSCHOOL_H_
#define _DOGSCHOOL_H_
#include <string>
#define MAX_DOGS 100
class Dog;
class DogSchool {
// 공개 메소드
public:
DogSchool(); // 기본 생성자.
DogSchool(const char *name);
void ShowDogs();
void RegisterDog(Dog *d); //(아직까진?) 포인터만 선언됐으니까클래스 선언만으로 충분....???
std::string getName();
void SetName(std::string n);
void DropSchool_tmp();
// 멤버 변수 및 비공개 함수
private:
std::string name_;
int numDogs_=0;
Dog *dogs_[MAX_DOGS];
};
#endif
<실행결과>
여기는 명지 애견학교입니다.
학생들을 소개합니다.
멍멍, 나는 철수입니다.나는 명지 애견학교에 다닙니다.
멍멍, 나는 영이입니다.나는 명지 애견학교에 다닙니다.
멍멍, 나는 똘이입니다.나는 명지 애견학교에 다닙니다.
여기는 명지 애견학교입니다.
학생들을 소개합니다.
멍멍, 나는 영이입니다.나는 명지 애견학교에 다닙니다.
멍멍, 나는 똘이입니다.나는 명지 애견학교에 다닙니다.
여기는 MJ Canine School입니다.
학생들을 소개합니다.
멍멍, 나는 Snoopy입니다.나는 MJ Canine School에 다닙니다.
멍멍, 나는 똘이입니다.나는 MJ Canine School에 다닙니다.
'C++ > 클래스 헤더파일 분리와 상호참조' 카테고리의 다른 글
클래스 상호참조 (수강신청 예제) (0) | 2021.01.27 |
---|---|
클래스 상호참조 (family 예제) (0) | 2021.01.27 |
클래스 상호참조 (분대와 분대원 예제) (0) | 2021.01.23 |