본문 바로가기
Game DevTip/STL

3. STL : 클래스 상속에 관하여.

by LIKE IT.라이킷 2024. 12. 7.

 

 

1. 클래스 상속(객체지향 방법론)

  • 객체와 메세지
    • 클래스 : 붕어빵 틀
    • 객체 : 붕어빵 실물 (메시지를 보내거나 받는 대리인(클래스에 의해서 만들어진 실물))
    • 메세지(함수) → 윈도우 프로그래밍에서는 주로 이벤트이다.
    • 즉, 객체가 처리해야할 일을 전달하는 것.(그냥 함수임)
    • 정보은닉 : 실제 처리되는 과정과 내용이 숨겨져 있다.

정리)

  • 클래스 : 프로그래머가 정의한 자료형
  • 객체 : 클래스 타입으로 선언하여 메모리에 할당 된 것.
  • 인터페이스 파일(헤더)
    • 객체를 추상화한 파일
    • 외부 사용자를 위한 파일
    • 클래스, 메시지(가상함수)가 정의된 파일 - 참고로 변수는 없음.
    • 외부사용자는 세부구현 내용을 몰라도 이 파일만 읽고 불러서 사용 가능.
  • 구현 파일(소스 파일)
    • 인터페이스 파일에 정의된 메시지(함수)를 구현한 파일
    • 내부 구현자가 작성한 파일.

‘?’연산자

char m_rval;
string m_sval;
bool m_bOpen;

string getSval() {return m_bOpen ? m_sval : "None";}

대충 m_bOpen이 true이면 m_sval을 리턴, 아니면 “none”을 리턴.

간단한 카드 게임(근데 사실 게임도 아님)

//Card.h(inline)

#pragma once
#include <iostream>
#include <string>
using namespace std;

class Card {

private:
    char m_rval;
    string m_sval;
    bool m_bOpen;

public:
    Card(char r, string s) : m_rval(r), m_sval(s), m_bOpen(false) {};
    ~Card();

    void flip() {m_bOpen = true;}
    char getRval() {return m_bOpen ? m_rval : 'N';}
    string getSval() {return m_bOpen ? m_sval : "None";}

    void draw()
    {
        if(m_bOpen)
        {
            cout <<  "Number = " << m_rval << endl;
            cout << "Shape = " << m_sval << endl;
        }
        else
        {
            cout << "Not open." << endl;
        }
    };

};
//main.cpp

#include "Card.h"

int main()
{
    Card myCard('A', "Spade");
    Card yourCard('5', "Heart");

    myCard.flip();
    cout << myCard.getRval() <<endl;
    cout << yourCard.getRval() << endl;

    yourCard.flip();
    myCard.draw();
    yourCard.draw();

    return 0;
}

상속성

  • 객체지향 프로그래밍에서 중요한 특성중 하나.
  • 하위 클래스는 상위 클래스의 속성을 상속 받아서 별도의 선언 없이 사용 가능.
  • 상위클래스의 구현 내용이 하위 클래스마다 다를경우
    • 상위클래스에서는 선언만 하고, 실제 구현은 하위 클래스에서함.(virtual void 가상함수)
//main.cpp -> 대충 Shape이 부모고, Triangle과, Circle이 자식(평행)들이 있는 클래스가 있을때.

//포인터를 이용해서 아래 하위 객체들을 부륵 가능.
Shape* shape = new Triangle(2,6);
shape -> Draw(); // Shape의 하위 클래스인 트라이앵글 클래스의 가상함수를 가리켜서 출력 가능.

shape = new Circle(20);
shape -> Draw(); //마찬가지로 하위 클래스인 서클 클래스를 가리켜서 출력 가능.

//상위 클래스에 없고 하위 클래스에 없는 놈들은 부르지 못함)
cout << shape->getBase()//에러남.(get base는 자식인 Triangle에 있음.)
  • 때문에 상위 클래스에서 가상함수로 만든 하위 클래스의 Draw 함수에서 하위 클래스에서 직접 만든
  • GetBase를 호출 하거나, 하위 클래스가 직접 불러야함.

더블 포인터

BaseButton **buttons; //호출할떄 자식중에 뭐가 올지 모를때 일단 더블 포인터.
Motor *motor;

IceDispenser(BaseButton **b, Motor *m) : butttons(b), Motor(m)

다음주 배열 처리 방법 관련(포인터) 끝나고 나면 리스트 나간다고 합니당

반응형

댓글