このプログラムは値を格納する際にキューかスタック化を選択することができます。
ファクトリを作ることは例を見てできたのですが、値の取り出し方が分かりません。
このプログラムをコンパイルすると次のようにエラーが出ます。値を取り出す際にその値のあるオブジェクトを指さなければいけません。その差し方が間違ってるのだと思いますが、直し方が分かりません。
ques12n3s.cpp: In function ‘int main()’:
ques12n3s.cpp:145: error: expected primary-expression before ‘;’ token
ques12n3s.cpp:147: error: expected primary-expression before ‘;’ token
どう直せばいいでしょうか。
c++
1#include <iostream> 2#include <cstdlib> 3#include <cctype> 4#include <typeinfo> 5using namespace std; 6 7// 抽象クラス 少なくとも1個の純粋仮想関数を含んでいるクラス 8class DataStruct { 9public: 10 DataStruct *head; // リスト先頭へのポインタ 11 DataStruct *tail; // リスト末尾へのポインタ 12 DataStruct *next; // 次項目へのポインタ 13 int num; // 格納される値 14 DataStruct () { head = tail = next = NULL; } 15 virtual void store(int i) = 0; // 純粋仮想関数 継承されて初めて存在できる 16 virtual int retrieve() = 0; // 純粋仮想関数 17}; 18 19// キュー型リストの作成 20class queue : public DataStruct { 21public: 22 void store(int i); 23 int retrieve(); 24}; 25 26void queue::store(int i) 27{ 28 DataStruct *item; 29 item = new queue; 30 31 if (!item) { 32 cout << "メモリ割り当てエラー.\n"; 33 exit(1); 34 } 35 item->num = i; 36cout << "キューに格納される値 " << i << '\n'; 37 38 // リスト末尾に置く 39 if (tail) tail->next = item; 40 tail = item; 41 item->next = NULL; 42 if (!head) head = tail; 43} 44 45int queue::retrieve() 46{ 47 int i; 48 DataStruct *p; 49 50 if (!head) { 51 cout << "リストは空です\n"; 52 return 0; 53 } 54 55 // リスト先頭から取り除く 56 i = head->num; 57 p = head; 58 head = head->next; 59 delete p; 60cout << "キューから取り出される値 " << i << '\n'; 61 return i; 62} 63 64// スタック型リストの作成 65class stack : public DataStruct { 66public: 67 void store(int i); 68 int retrieve(); 69}; 70void stack::store(int i) 71{ 72 DataStruct *item; 73 item = new stack; 74 75 if (!item) { 76 cout << "メモリ割り当てエラー\n"; 77 exit(1); 78 } 79 item->num = i; 80cout << "スタックに格納される値 " << i << '\n'; 81 82 // スタックのような操作になるよう、リスト最前部に置く 83 if (head) item->next = head; 84 head = item; 85 if(!tail) tail = head; 86} 87 88int stack::retrieve() 89{ 90 int i; 91 DataStruct *p; 92 93 if (!head) { 94 cout << "リストは空です\n"; 95 return 0; 96 } 97 98 // リスト先頭から取り除く 99 i = head->num; 100 p = head; 101 head = head->next; 102 delete p; 103cout << "スタックから取り出される値 " << i << '\n'; 104 return i; 105} 106 107// オブジェクトを作るファクトリ 108DataStruct *DataStructFactory(char what) 109{ 110 switch (what) { 111 case 'q': 112 return new queue; 113 case 's': 114 return new stack; 115 } 116} 117 118int main() 119{ 120 DataStruct *p; 121 char ch; 122 int i; 123 124 // 値を格納 125 for (i = 0;i < 10;i++) { 126 cout << "キューかスタックを選択(q/s):"; 127 cin >> ch; 128 ch = tolower(ch); 129 p = DataStructFactory(ch); // 次のオブジェクトを取得する 130 131 cout << typeid(*p).name() << endl; 132 133 // 値をキューまたはスタックに格納 134 p->store(i); 135 } 136 137 // 値を取りだす 138 cout << "Tを入力すると終了します\n"; 139 for (;;) { 140 cout << "キューとスタックのどちらを取りだしますか(q/s):"; 141 cin >> ch; 142 ch = tolower(ch); 143 if(ch == 't') break; 144 if(ch == 'q') { 145 p =queue ; 146 } else { 147 p =stack ; 148 } 149 cout << p->retrieve() << '\n'; 150 } 151 152 return 0; 153} 154
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/20 16:03
2015/07/20 16:13
退会済みユーザー
2015/07/20 16:20 編集
2015/07/20 16:31