質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3343閲覧

c++ ファクトリでオブジェクトを作成後、そのオブジェクトをポインタで指すには

fgfnabwym

総合スコア78

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/07/20 13:32

このプログラムは値を格納する際にキューかスタック化を選択することができます。
ファクトリを作ることは例を見てできたのですが、値の取り出し方が分かりません。

このプログラムをコンパイルすると次のようにエラーが出ます。値を取り出す際にその値のあるオブジェクトを指さなければいけません。その差し方が間違ってるのだと思いますが、直し方が分かりません。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このコードだとどういうことがやりたいのかよく判りませんけど・・最初の for ループで queue や stack をループ毎に作成しているようなのですが、それであっていますか? これだと、要素数が1個の queue や stack が合計 10 個作成されるだけですけれども・・

それとも、このファクトリは静的な queue や stack のインスタンスを返すのが正しいのではありませんか?

例えば次のようにです。

lang

1DataStruct *DataStructFactory(char what) 2{ 3 static queue q; 4 static stack s; 5 6 switch (what) { 7 case 'q': 8 return &q; 9 case 's': 10 return &s; 11 } 12}

もし、そうなのだとしたら、main 関数のコンパイルエラーになっている箇所は次のようになります。

lang

1 for (;;) { 2 cout << "キューとスタックのどちらを取りだしますか(q/s):"; 3 cin >> ch; 4 ch = tolower(ch); 5 if(ch == 't') break; 6 //if(ch == 'q') { 7 // p =queue ; 8 //} else { 9 // p =stack ; 10 //} 11 p = DataStructFactory(ch); 12 cout << p->retrieve() << '\n'; 13 }

ただ、これだと ファクトリ ではありませんけど・・・

投稿2015/07/20 15:54

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fgfnabwym

2015/07/20 16:03

ngyukiさん、回答ありがとうございます。 問題には動的に確保するとは書いてなかったのですが、自分で勝手に動的に確保していました。 教えていただいたように一旦直してみます。
fgfnabwym

2015/07/20 16:13

エラーが消えて動くようになりました。 ngyukiさん、ありがとうございました。
退会済みユーザー

退会済みユーザー

2015/07/20 16:20 編集

見た感じでは、ファクトリの実装方法とキュー・スタックの動作の違いが分かれば良いような気がしますが。 そうだとすると、最初に1度キューかスタックの選択をさせ、あとは生成したインスタンスに対する値の詰め込みと取り出しをする処理を書くだけでいいと思いますよ。 キューとスタックのクラスには、emptyを判定する関数があった方が良いとは思いますけど。
fgfnabwym

2015/07/20 16:31

pikovoltさん、教えて下さりありがとうございます。 参考書を見てもあまり理解できず、時間だけが過ぎてしまい。 もう一度直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問