困っていること
増補改訂版Java言語で学ぶデザインパターン入門を参考に各デザインパターンを勉強しています。会社で使っている言語がC++なので,Java言語で学んだデザインパターンをC++で置き換えているのですが,イテレータのパターンでエラー(エラー内容参照)が出ていて困っています。何が原因かわからないので,どなたかご教授お願いします。
参考文献
C++でデザインパターンを実装する:イテレータ編 - Qiitaを参考にC++のイテレータのデザインパターンを学んでいます。
エラー内容
C++
1[bcc32c エラー] main.cpp(40): invalid operands to binary expression ('std::ostream' (aka 'basic_ostream<char, char_traits<char> >') and 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >'))
ソース
[myClass.cpp]
C++
1//--------------------------------------------------------------------------- 2 3#pragma hdrstop 4 5#include "myClass.h" 6//--------------------------------------------------------------------------- 7// セッター 8//void Menu::setName(const string& newName) 9void Menu::setName(const AnsiString& newName) 10{ 11 this->name = newName; 12} 13 14// ゲッター 15//string Menu::getName(void) 16AnsiString Menu::getName(void) 17{ 18 return this->name; 19} 20 21// 指定のメニューを取得する 22Menu MenuBook::getBookAt(int index) 23{ 24 return book[index]; 25} 26 27// メニューブックにメニューを追加する 28void MenuBook::appendBook(const Menu& newMenu) 29{ 30 // メニューを末尾に追加 31 book.push_back(newMenu); 32 last++; 33} 34 35// メニューブックに登録されているメニュー数を返す 36size_t MenuBook::getLength(void) 37{ 38 return book.size(); 39} 40 41// MenuBookのイテレータであるMenuBookIteratorを生成して返す 42Iterator* MenuBook::myIterator() 43{ 44 // ポインタを受け取った時,MenuBookIteratorが定義されていないと 45 // No matching constructor for initialization of 'MenuBookIterator' 46 // のエラーが出る 47 Iterator *p = new MenuBookIterator(this); 48 49 return p; 50} 51 52// イテレータが現在指し示す要素の次が存在するかメソッド 53bool MenuBookIterator::hasNext(void) 54{ 55 if(index < menubook.getLength()) 56 { 57 return true; 58 } 59 else 60 { 61 return false; 62 } 63} 64 65// イテレータが現在,指し示すメニューを返して,indexを1つ進める 66Menu MenuBookIterator::next(void) 67{ 68 Menu menu = menubook.getBookAt(index); 69 index++; 70 71 return menu; 72} 73//--------------------------------------------------------------------------- 74#pragma package(smart_init) 75
[myClass.h]
C++
1//--------------------------------------------------------------------------- 2 3#ifndef myClassH 4#define myClassH 5//--------------------------------------------------------------------------- 6#include <stdio.h> 7#include <iostream> 8#include <vector> 9using namespace std; 10 11// 前方宣言(C言語でいうプロトタイプ宣言) 12class Aggregate; 13class Iterator; 14class Menu; 15 16// Aggregate抽象クラス 17class Aggregate 18{ 19public: 20 // myIteratorメソッド 21 // 純粋仮想関数であり,サブクラスで再定義されないと使えない 22 virtual Iterator* myIterator(void) = 0; 23 // 仮想デストラクタ 24 virtual ~Aggregate(){} 25}; 26 27// Iterator抽象クラス 28class Iterator 29{ 30public: 31 // hasNextメソッド 32 // 純粋仮想関数であり,サブクラスで再定義されないと使えない 33 virtual bool hasNext() = 0; 34 // nextメソッド 35 // 純粋仮想関数であり,サブクラスで再定義されないと使えない 36 virtual Menu next() = 0; 37 // 仮想デストラクタ 38 virtual ~Iterator(){} 39}; 40 41// Menuクラス 42class Menu 43{ 44private: 45 // メニュー名 46 string name = ""; 47public: 48 // デフォルトコンストラクタ 49 Menu(){} 50 // 明示コンストラクタ 51 explicit Menu(const string& newName) 52 { 53 this->name = newName; 54 } 55 // デストラクタ 56 ~Menu(){} 57 // セッター 58 void setName(const string& newName); 59 // ゲッター 60 string getName(void); 61}; 62 63// MenuBookクラス 64class MenuBook : public Aggregate 65{ 66private: 67 // Menuを管理するvector 68 vector<Menu> book; 69 // vectorが管理するメニューの総数 70 unsigned int last = 0; 71public: 72 // 指定のメニューを取得する 73 Menu getBookAt(int index); 74 // メニューブックにメニューを追加する 75 void appendBook(const Menu& newMenu); 76 // メニューブックに登録されているメニュー数を返す 77 size_t getLength(void); 78 // MenuBookのイテレータとしてMenuBookIteratorを生成し返す 79 Iterator* myIterator(void); 80 // デストラクタ 81 ~MenuBook(){} 82}; 83 84// MenuBookIteratorクラス 85class MenuBookIterator : public Iterator 86{ 87private: 88 // メニューブック 89 MenuBook menubook; 90 // メニューブックのどこをイテレータが指しているかを記録する変数 91 unsigned int index; 92public: 93 // コンストラクタ 94 MenuBookIterator(MenuBook newMenubook) 95 { 96 this->menubook = newMenubook; 97 this->index = 0; 98 } 99 // ポインタを受けとった時のコンストラクタ 100 // これがないとIterator *p = new MenuBookIterator(this);でエラー 101 explicit MenuBookIterator(MenuBook *newMenubook) 102 { 103 this->menubook = *newMenubook; 104 this->index = 0; 105 } 106 // デストラクタ 107 ~MenuBookIterator(){} 108 109 // hasNextメソッド 110 bool hasNext(void); 111 // nextメソッド 112 Menu next(void); 113}; 114//--------------------------------------------------------------------------- 115#endif
[main.cpp]
C++
1#pragma hdrstop 2#pragma argsused 3 4#ifdef _WIN32 5#include <tchar.h> 6#else 7 typedef char _TCHAR; 8 #define _tmain main 9#endif 10 11#include <stdio.h> 12#include <iostream> 13#include <ostream> 14#include "myClass.h" 15using namespace std; 16 17int _tmain(int argc, _TCHAR* argv[]) 18{ 19 // Menuオブジェクトを生成 20 Menu menu1("Omurice"); 21 Menu menu2("CurryRice"); 22 Menu menu3("BlackRice"); 23 Menu menu4("WhiteRice"); 24 25 // 生成したMenuをMenuBookにメニューを追加 26 MenuBook menubook; 27 menubook.appendBook(menu1); 28 menubook.appendBook(menu2); 29 menubook.appendBook(menu3); 30 menubook.appendBook(menu4); 31 32 // MenuBookのiteratorを生成 33 // Iteratorはmenubook自身を受け取る 34 Iterator* it = menubook.myIterator(); 35 36 while(it->hasNext()) 37 { 38 // イテレータが指すメニューの名前を表示 39 // it->next()はmenubookの登録されたmenuを指す 40 // ↓でエラーが出る。 41 cout << it->next().getName() << endl; 42 } 43 44 delete(it); 45 46 return 0; 47}
開発環境
OS:Windows64bit
IDE:Embarcadero C++Builder 10.3.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/20 10:34