非const左辺値参照エラーを解決したいです
Qiitaの「プログラミング入門者からの卒業試験は『ブラックジャック』を開発すべし」の記事を読んで、c++を使用してトランプゲームのブラックジャック作成に挑戦しています。
- Cardクラスでカードの数(no)、マーク(mark)を持つ
- Deckクラスで山札(vector<Card*> cards)を作成(CreateDeck関数、ShuffleCards関数)
- Playerクラスでcardsからカードを一枚引き(DrawCards関数)、手札(vector<Card*> playerCards)に追加する
上記を実装したいのですが、DrawCardsに以下のエラーが出てしまい、てこずっています。。
html
1Non-const lvalue reference to type 'vector<Card *>' cannot bind to a value of unrelated type 'Deck' 2
- DrawCards()の引数をDeck &cardsにすればいいのか?と思いましたが、そうすると今度はundefined variableとなってしまいます。
- Deckオブジェクトがvector<Card*> cardsを返すGetCard()関数を作って、DrawCards内で呼び出す?とも思いましたが、うまくいかず、コード内には関数が残っていますが使っていません。
- Playerクラスは今後UserとDealerに分けて継承クラスを作るつもりです。
Playerオブジェクトがvector<Card*> cardsからカードを引くにはどうしたら良いのでしょうか?
ご教授よろしくお願いいたします。
main.cpp
html
1#include <iostream> 2#include <vector> 3#include <string> 4 5#include "deck.hpp" 6#include "card.hpp" 7#include "player.hpp" 8 9using std::cout; 10using std::vector; 11using std::string; 12 13void StartGame() { 14 //Start a game 15 cout << "Let's begin Black Jack!!\n\n"; 16 return; 17} 18 19 20int main() { 21 Deck cards; 22 Player player; 23 Player playerCards; //card list that the user has 24 25 StartGame(); 26 cards.CreateDeck(); 27 cards.ShuffleCards(); 28 29 player.DrawCards(cards); //エラーが出る 30 31 return 0; 32} 33
card.hpp
html
1#ifndef card_hpp 2#define card_hpp 3 4#include <stdio.h> 5#include <iostream> 6#include <vector> 7#include <string> 8 9using std::string; 10using std::vector; 11 12 13// Define Card class 14class Card { 15 public: 16// Card(); 17// ~Card(); 18 void Print(); 19 void SetNos(int nos); 20 void SetMarks(int marks); 21 int mark; 22 int no; 23 private: 24}; 25 26#endif /* card_hpp */
card.cpp
html
1#include <iomanip> 2#include "card.hpp" 3 4using std::cout; 5using std::setw; 6 7void Card::Print() { 8 string markStr = "default"; 9 10 switch (this->mark) { 11 case 0: 12 markStr = "♠︎"; 13 break; 14 case 1: 15 markStr = "☘"; 16 break; 17 case 2: 18 markStr = "❤︎"; 19 break; 20 case 3: 21 markStr = "♦︎"; 22 break; 23 } 24 cout << setw(2)<< this->no << " of " << markStr << "\n"; 25} 26 27void Card::SetNos(int nos) { 28 no = (nos % 13) + 1 ; 29 return; 30} 31 32void Card::SetMarks(int marks) { 33 // 0:Spade 1:Club 2:Heart 3:Diamond 34 mark = marks / 13; 35 return; 36}
deck.hpp
html
1#ifndef deck_hpp 2#define deck_hpp 3 4#include <stdio.h> 5#include <vector> 6#include "card.hpp" 7 8using std::vector; 9 10// Define Deck class 11class Deck { 12 public: 13 void CreateDeck(); 14 void ShuffleCards(); 15 Card* GetCard(); 16 private: 17 vector<Card*> cards; 18}; 19 20#endif /* deck_hpp */
deck.cpp
html
1# include <algorithm> 2#include <iostream> 3#include <vector> 4#include <array> 5#include <random> 6#include "deck.hpp" 7#include "card.hpp" 8 9 10using std::cout; 11using std::vector; 12using std::string; 13using std::array; 14 15 16void Deck::CreateDeck() { 17 int CARD = 52; 18 19 for (int i = 0; i < CARD; ++i) { 20 Card* cd; 21 cd = new Card; 22 cd->SetNos(i); 23 cd->SetMarks(i); 24 cards.push_back(cd); 25 } 26 27 cout << "Before Shuffle:\n"; 28 for (auto& e : cards) { 29 e->Print(); 30 } 31 return; 32} 33 34void Deck::ShuffleCards() { 35 std::random_device seed_gen; 36 std::mt19937 engine(seed_gen()); 37 std::shuffle(cards.begin(), cards.end(), engine); 38 39 cout << "\nAfter shuffle:\n"; 40 for (auto& e : cards) { 41 e->Print(); 42 } 43 return; 44} 45 46Card* Deck::GetCard() { 47 Card* cd; 48 cd = new Card; 49 50 cd = cards.at(0); 51 cards.erase(cards.begin()); 52 53 return cd; 54}
player.hpp
html
1#ifndef player_hpp 2#define player_hpp 3 4#include <stdio.h> 5#include <iostream> 6#include <vector> 7#include <string> 8#include "deck.hpp" 9#include "card.hpp" 10 11 12using std::string; 13using std::vector; 14 15 16// Define Player class 17class Player { 18 public: 19 Player(); // Constructor 20 void DrawCards(vector<Card*> &cards); 21// bool isBurst(); 22 private: 23 vector<Card*> playerCards; 24 int playerPoint; 25}; 26 27// Define User class, derived from Player class 28class User : public Player { 29 public: 30 void DrawCards(); 31 private: 32}; 33 34// Define Dealer class, derived from Player class 35class Dealer : public Player { 36 public: 37 void DrawCards(); 38 private: 39}; 40 41 42#endif /* player_hpp */
player.cpp
html
1#include <iostream> 2#include <vector> 3#include <string> 4#include "player.hpp" 5 6 7using std::cout; 8using std::string; 9using std::vector; 10 11 12Player::Player() { 13 // FIXME 14} 15 16void Player::DrawCards(vector<Card*> &cards) { 17 Card* hand; 18 19 hand = cards.at(0); 20 cards.erase(cards.begin()); 21 playerCards.push_back(hand); 22 23 cout << "Your card is "; 24 hand->Print(); 25 return; 26}
利用環境・ツール
macOS Catalina version 10.15.6
Xcode Version 11.5 (11E608c)
Apple clang version 11.0.3 (clang-1103.0.32.62)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/26 05:47
2020/08/26 05:50 編集
2020/08/27 01:48
2020/08/27 02:04