Minwoo Dev.

[C++] 윤성우의 열혈 C++ 프로그래밍 ch 07-1 : 상속과 생성자의 호출 문제풀이 본문

C++

[C++] 윤성우의 열혈 C++ 프로그래밍 ch 07-1 : 상속과 생성자의 호출 문제풀이

itisminu 2024. 4. 14. 16:45
728x90
반응형
SMALL

문제 1

앞서 상속관계에 놓여있는 클래스의 생성자 정의 및 호출 방식에 대해 설명하였다. 이 내용을 바탕으로 다음 클래스에 적절한 생성자를 삽입해보자. 그리고 이의 확인을 위한 main 함수를 적절히 정의해 보자.

 

class Car
{
private:
    int gasolineGauge;

public:
    int GetGasGauge()
    {
        return gasolineGauge;
    }
};

class HybridCar : public Car
{
private:
    int electricGauge;

public:
    int GetElecGauge()
    {
        return electricGauge;
    }
};

class HybridWaterCar : public HybridCar
{
private:
    int waterGauge;

public:
    void ShowCurrentGauge()
    {
        cout << "잔여 가솔린 : " << GetGasGauge() << endl;
        cout << "잔여 전기량 : " << GetElecGauge() << endl;
        cout << "잔여 워터량 : " << waterGauge << endl;
    }
};

 

 

참고로, Car 클래스는 가솔린으로 동작하는 자동차를 표현한 것이고, HybridCar 클래스는 가솔린과 전기로 동작하는 자동차를 표현한 것이다. 그리고 마지막으로 HybridWaterCar 클래스는 가솔린과 전기뿐만 아니라, 물도 동시에 연료로 사용할 수 있는, 가상의 자동차를 표현한 것이다.

그러나 이 문제는 위의 클래스들이 의미하는 바를 몰라도 해결이 가능하다.

 

그리고 위의 코드에서는 앞서 보인 예제들과 달리 상속의 깊이(몇 단계에 걸쳐서 상속이 이뤄지고 있는가를 의미함)가 한단계 더해졌지만, 그로 인해서 여러분이 더 알아야 할 문법적 지식이 있거나, 해석하는 방식에 있어서 차이가 있는 것은 아니니, 이 부분에 부담을 느끼지 않았으면 좋겠다.

 

 

정답

#include <iostream>
using namespace std;

class Car
{
private:
    int gasolineGauge;

public:
    Car() : gasolineGauge(0) {}
    Car(int n) : gasolineGauge(n) {}
    int GetGasGauge()
    {
        return gasolineGauge;
    }
};

class HybridCar : public Car
{
private:
    int electricGauge;

public:
    HybridCar() : Car(), electricGauge(0) {}
    HybridCar(int n) : Car(n), electricGauge(0) {}
    HybridCar(int n1, int n2) : Car(n1), electricGauge(n2) {}
    int GetElecGauge()
    {
        return electricGauge;
    }
};

class HybridWaterCar : public HybridCar
{
private:
    int waterGauge;

public:
    HybridWaterCar() : HybridCar(), waterGauge(0) {}
    HybridWaterCar(int n) : HybridCar(n), waterGauge(0) {}
    HybridWaterCar(int n1, int n2) : HybridCar(n1, n2), waterGauge(0) {}
    HybridWaterCar(int n1, int n2, int n3) : HybridCar(n1, n2), waterGauge(n3) {}
    void ShowCurrentGauge()
    {
        cout << "잔여 가솔린 : " << GetGasGauge() << endl;
        cout << "잔여 전기량 : " << GetElecGauge() << endl;
        cout << "잔여 워터량 : " << waterGauge << endl;
    }
};

int main(void)
{
    HybridWaterCar hywacar(40, 200, 80);
    hywacar.ShowCurrentGauge();
}

 

 

실행 결과

 

 

 

문제 2

다음 두 클래스에 적절한 생성자와 소멸자를 정의해보자. 그리고 이의 확인을 위한 main 함수를 정의해보자.

 

#include <iostream>
#include <cstring>
using namespace std;

class MyFriendInfo
{
private:
    char *name;
    int age;

public:
    void ShowMyFriendInfo()
    {
        cout << "이름 : " << name << endl;
        cout << "나이 : " << age << endl;
    }
};

class MyFriendDetailInfo : public MyFriendInfo
{
private:
    char *addr;
    char *phone;

public:
    void ShowMyFriendDetailInfo()
    {
        ShowMyFriendInfo();
        cout << "주소 : " << addr << endl;
        cout << "전화 : " << phone << endl
             << endl;
    }
};

int main(void)
{
    MyFriendDetailInfo frd("Minwoo", 23, "Korea", "010-1234-5678");
    frd.ShowMyFriendDetailInfo();
}

 

 

정답 

#include <iostream>
#include <cstring>
using namespace std;

class MyFriendInfo
{
private:
    char *name;
    int age;

public:
    MyFriendInfo(char *fname, int fage) : age(fage)
    {
        name = new char[strlen(fname) + 1];
        strcpy(name, fname);
    }
    void ShowMyFriendInfo()
    {
        cout << "이름 : " << name << endl;
        cout << "나이 : " << age << endl;
    }
    ~MyFriendInfo()
    {
        delete[] name;
    }
};

class MyFriendDetailInfo : public MyFriendInfo
{
private:
    char *addr;
    char *phone;

public:
    MyFriendDetailInfo(char *fname, int fage, char *faddr, char *fphone) : MyFriendInfo(fname, fage)
    {
        addr = new char[strlen(faddr) + 1];
        phone = new char[strlen(fphone) + 1];
        strcpy(addr, faddr);
        strcpy(phone, fphone);
    }
    void ShowMyFriendDetailInfo()
    {
        ShowMyFriendInfo();
        cout << "주소 : " << addr << endl;
        cout << "전화 : " << phone << endl
             << endl;
    }
    ~MyFriendDetailInfo()
    {
        delete[] addr;
        delete[] phone;
    }
};

int main(void)
{
    MyFriendDetailInfo frd("Minwoo", 23, "Korea", "010-1234-5678");
    frd.ShowMyFriendDetailInfo();
}

 

 

실행 결과

728x90
반응형
LIST