C++/클래스 헤더파일 분리와 상호참조

클래스 상호참조 (분대와 분대원 예제)

<main.cpp>


#include <iostream>
#include "squad.h"
#include "soldier.h"
using namespace std;

int main(){
    Squad *b = new Squad ("번개 분대");
    Soldier *s1, *s2, *s3;
    s1 = new Soldier("일병", "홍길동");
    s2 = new Soldier("이병", "김길동");
    s3 = new Soldier("병장", "박길동");
    b->addSoldier(s1); b->addSoldier(s2); b->addSoldier(s3);
    b->stat();
    s1->speak();
    s2->speak();
    b->setName("천둥 분대");//rename
    s1->speak();
    return 0;
}


<soldier.cpp>


#include <iostream>
#include "squad.h"
#include "soldier.h"
Soldier::Soldier(const char *rank, const char *name){
        rank_=rank;
        name_=name;
}
void Soldier::speak(){
        std::cout<<rank_<<" "<<name_<<"! 소속 분대는 "<<army_<<" 입니다."<<std::endl;
}
void Soldier::getSquad(std::string name){
        army_=name;
}
std::string Soldier::getRank(){
        return rank_;
}
std::string Soldier::getName(){
        return name_;
}


<squad.cpp>


#include <iostream>
#include "squad.h"
#include "soldier.h"
Squad::Squad(const char *army){
        squad_=army;
        num_soldier=0;
}
void Squad::addSoldier(Soldier *sd){
        soldier[num_soldier]=sd;
        soldier[num_soldier]->getSquad(squad_);
        num_soldier++;
}
std::string Squad::getSoldier(){
        return this->squad_;
}
void Squad::stat(){
        std::cout<<squad_<<std::endl;
        std::cout<<"총원 "<<num_soldier<<"명\n";
        for(int i=0;i<num_soldier;i++){
                rank_=soldier[i]->getRank();
                name_=soldier[i]->getName();
                std::cout<<rank_<<" "<<name_<<std::endl;
        }
        std::cout<<std::endl;
}
void Squad::setName(std::string n){
        squad_=n;
        //모든분대원들을 돌면서 각 분대원에게 접근해서 getSquad()
        for(int i=0;i<num_soldier;i++){
                soldier[i]->getSquad(squad_);
        }
}

<soldier.h>


#ifndef _SOLDIER_H
#define _SOLDIER_H
#include <string>
class Squad;
class Soldier{
        public:
                Soldier(const char *rank,const char *name);
                void speak();
                void getSquad(std::string name);
                std::string getRank();
                std::string getName();
        //      void getSquad(std::string name):
                //std::string getSquad();
        private:
                Squad *squad_;
                std::string rank_;
                std::string name_;
                std::string army_;
};
#endif

<squad.h>


#ifndef _SQUAD_H
#define _SQUAD_H
#include <string>
class Soldier;
class Squad{
        public:
                Squad(const char *army); //생성자
                void addSoldier(Soldier *sd);
                std::string getSoldier();
                std::string getRank();
                std::string getName();
                void stat();
                void setName(std::string n);
        private:
                Soldier *soldier_;
                std::string army_;
                std::string squad_;
                std::string rank_;
                std::string name_;
                Soldier *soldier[10];
                int num_soldier;
};
#endif


<실행결과>


번개 분대
총원 3명
일병 홍길동
이병 김길동
병장 박길동

일병 홍길동! 소속 분대는 번개 분대 입니다.
이병 김길동! 소속 분대는 번개 분대 입니다.
일병 홍길동! 소속 분대는 천둥 분대 입니다.