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

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

新規登録して質問してみよう
ただいま回答率
85.47%
デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

C++

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

Q&A

解決済

1回答

3121閲覧

「invalid operands to binary expression」のエラーが出るので解決したい。

dem0nmichik0

総合スコア37

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

C++

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

0グッド

0クリップ

投稿2021/09/19 05:03

編集2021/09/19 05:19

困っていること

増補改訂版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

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

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

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

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

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

guest

回答1

0

ベストアンサー

私のてもとでは、main.cppに
`#include <string>'
を追加したらエラーは出なくなりました。
(そのエラーになる詳細なメカニズムは詳しい方におまかせ...)

投稿2021/09/19 07:23

thkana

総合スコア7645

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

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

dem0nmichik0

2021/09/20 10:34

thkana様 回答ありがとうございます。 ご指摘のように'#include <string>'を追加したら,でなくなりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問