-
명품 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