#include #include #include using namespace std; // ノートクラス. class Notebook { protected: string* note; // ノートの本文. int pages; // ノートの総ページ数. public: // ノートクラスのコンストラクタ. Notebook() { pages = 0; note = NULL; } Notebook(int pp) { note = new string[pages=pp]; } // ノートクラスのコピーコンストラクタ. Notebook(const Notebook&); // ノートクラスのデストラクタ 用意したノートを削除. virtual ~Notebook() { delete [] note; } // ノートクラスの代入演算子のオーバーロード. Notebook& operator=(const Notebook&); // ノートを読む 指定がなければ最初のページ(1ページ目)を読む. virtual string Read(int p = 1) const; // ノートに書く 指定がなければ最初のページ(1ページ目)に書く. virtual void Write(string, int p = 1); }; // ノートクラスのコピーコンストラクタ. Notebook::Notebook(const Notebook& nb) { if (nb.pages > 0) { // ページが存在するとき. note = new string[pages=nb.pages]; // 初期化するページ分だけnew // ページをコピー. for (int i = 0; i < pages; i++) note[i] = nb.note[i]; } else { // ページ数が0のとき. pages = 0; note = NULL; } } // ノートクラスの代入演算子のオーバーロード. Notebook& Notebook::operator=(const Notebook& nb) { if (this != &nb && nb.pages > 0) { delete [] note; // 現在のnoteをdelete note = new string[pages=nb.pages]; // 代入するページ分だけnew // ページを代入. for (int i = 0; i < pages; i++) note[i] = nb.note[i]; } else if (nb.pages == 0) { // ページ数が0のとき. pages = 0; note = NULL; } return *this; } // ノートを読む. string Notebook::Read(int p) const { p--; // ノートは1ページ目が最初のページ. if (p >= 0 && p < pages) { if (note[p].empty()) return "This page is empty."; return note[p]; // noteの内容を返す. } else return "Cannot read: out of pages."; // ページ外. } // ノートに書く. void Notebook::Write(string str, int p) { p--; // ノートは1ページ目が最初のページ. if (p >= 0 && p < pages) note[p] = str; // noteに代入する. else cerr << "Cannot write: out of pages." << endl; // ページ外. } int main() { stringstream sstr; // 文字列ストリーム. int i; Notebook noteA(5); // 5ページのノートA // ノートAに書き込む. for (i = 1; i <= 5; i++) { sstr << "Notebook - Page " << i << ends; noteA.Write(sstr.str(), i); sstr.seekp(0, ios_base::beg); } Notebook noteB(noteA); // ノートAをコピーしたノートB // Notebook noteB = noteA; と同じ. Notebook noteC(10); // 10ページのノートC noteC = noteA; // ノートCにノートAを代入. for (i = 1; i <= 5; i++) cout << noteA.Read(i) << endl; for (i = 1; i <= 5; i++) cout << noteB.Read(i) << endl; for (i = 1; i <= 10; i++) cout << noteC.Read(i) << endl; return 0; }