ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명품 C++ 8장 7번
    C++ 2018. 11. 4. 20:13

    7. 아래와 같은 BaseMemory 클래스를 상속받는 ROM(Read Only Memory), RAM 클래스를 작성하라. BaseMemeory에 필요한 코드를 수정 추가하여 적절히 완성하라.


    class BaseMemory {
        char *mem;
    protected:
        BaseMemory(int size) { mem = new char[size]; }
    };


    ROM은 읽기 전용 메모리이므로 작동 중에 값을 쓸 수가 없기 때문에, 공장에서 생산할 때 생산자가 요청한 데이터로 초기화하는데 이 작업을 굽는다(burn)라고 한다. 그러므로 ROM은 반드시 생성자에서 burn 작업이 일어나야 한다.

    다음은 ROM과 RAM 메모리를 생성하고 사용하는 사례이다. ROM의 0번지에서 4번지까지 읽어 RAM 메모리의 0~4번지에 쓰고, 다시 RAM 메모리의 값을 화면에 출력한다. 전체 프로그램을 완성하라.


    소스코드


    #include <iostream>
    using namespace std;
    class BaseMemory {
        char *mem;
    protected:
        BaseMemory(int size) { mem = new char[size]; }
        ~BaseMemory() { delete[] mem; }
        char getMem() { return *mem; }
        char getIndex(int index) { return mem[index]; }
        void setIndex(int index, char c) { mem[index] = c; }
        void setMem(char x[],int s) {
            for (int i = 0; i < s; ++i)
                mem[i] = x[i];
        }
    };
    class ROM : virtual protected BaseMemory {
    public:
        ROM(int size, char x[], int s) : BaseMemory(size) { setMem(x,s); }
        char read(int index) { return getIndex(index); }
    };
    class RAM : virtual protected BaseMemory {
    public:
        RAM(int size) : BaseMemory(size) {}
        void write(int index, char c) { setIndex(index, c); }
        char read(int index) { return getIndex(index); }
    };
    int main() {
        char x[5] = { 'h','e','l','l','o' };
        ROM biosROM(1024 * 10, x, 5); // 10KB의 ROM 메모리. 배열 x로 초기화됨
        RAM mainMemory(1024 * 1024); // 1MB의 RAM 메모리
        // 0 번지에서 4번지까지 biosROM에서 읽어 mainMemroy에 복사
        for (int i = 0; i < 5; ++i) mainMemory.write(i, biosROM.read(i));
        for (int i = 0; i < 5; ++i) cout << mainMemory.read(i);
    }


    실행결과



    BaseMemory 상속을 받는 클래스가 2개이기 때문에 나중에 ROM과 RAM 클래스를 상속받는 새로운 클래스를 만들면 모호성의 문제가 생기기때문에 virtual 키워드를 사용하여 RAM ROM 은 가상상속을 해야합니다.

    mem 에는 파생클래스에서 직접 접근 할 수 없기 때문에, 함수를 통해 접근합니다.

    'C++' 카테고리의 다른 글

    명품 C++ 8장 9번  (5) 2018.11.04
    명품 C++ 8장 8번  (0) 2018.11.04
    명품 C++ 8장 5번 6번  (0) 2018.11.04
    명품 C++ 8장 3번 4번  (0) 2018.11.04
    명품 C++ 8장 1번 2번  (0) 2018.11.04

    댓글

© 2018 TISTORY. All rights reserved.