سؤال

لقد جعلت برنامجي يعمل مع ناقل واحد وقررت استخدام متجه ثنائي الأبعاد لتمثيل أيادي متعددة (متجه أحادي البعد vPlayerHand1 بالإضافة إلى متجه ثنائي الأبعاد vPlayerHand2 plus ...).لا أستطيع معرفة كيفية تعبئة المتجه.أنا أستخدم Visual Studio C++ 2010 والذي لا يبدو أنه يطبق C++ 11 بشكل كامل ويبلغ عن أخطاء التحليل في IDE للتعليمات البرمجية التي يتم توفيرها كإجابات لأسئلة مماثلة في هذا المنتدى.في المخطط التفصيلي أدناه البطاقة هي فئة.

#include <vector>

std::vector<std::vector<Card>> vPlayerHand;

vPlayerHand.push_back(vShoe.back());  /* fails with parsing error No instance of 
                                         overloaded function... */
vPlayerHand[0].push_back(vShoe.back());  /* builds okay then error Debug Assertion
                                            Failed... vector subscript out of range */

أفتقد شيئًا ما حول الاستخدام الصحيح لوظيفة Push_back مع متجه ثنائي الأبعاد (متجه المتجهات) أفهم أن المرجع الأول هو الصف.وعندما أقوم بالتعبئة باستخدام Push_back، يجب أن أقوم بالصف الأول فقط.

هنا رمز أكثر اكتمالا:

تم التعديل في السطر 29...يتم تشغيل التعليمات البرمجية بشكل صحيح كما تم إعادة تحريره في السطر 32A وفقًا للحل الذي يعمل RSAHU بشكل صحيح.تم التعليق على السطر 29

1  # include <iostream>
2  # include <vector>
3  # include <algorithm>
4  # include <ctime> 
5  # include "Card.h"  //Defines Card as having Suit, Rank and functions GetSuit()   GetRank()
6
7  std::vector<Card> vShoe;                  //Card Shoe vector holds 1-8 decks
8  std::vector<Card> vDeck;                  //Deck vector holds 52 cards of Card class
9  std::vector<std::vector<Card>> vPlayerHand; // Player Hands 0-original, 1-split1, n-splitn
10 std::vector<Card> vDealerHand;
11
12 void CreateDeck();       //Populates Deck with 52 Cards 
13 void CreateShoe(int);   //Populates Show with Decks*n number of Decks
14 void ShuffleShoe();      // uses random_shuffle
15 
16 int main() {
17 
18 int iDeckCount = 2;
19 const int NumPlayers = 1;
20 srand(time(0)); 
21 
22 
23 CreaateDeck();
24 CreateShoe(iDeckCount);
25 ShuffleShoe();
26 
27 // Following line gives parsing error
28 // vPlayerHand = std::vector<std::vector<Card>> (5, std::vector<std::vector<Card>>(12));

    // added this line and now runs as expected
    /* removed this line in favor of line 32a as per @RSahu  
29 vPlayerHand.resize(2);  // need only initial size for 2 elements
    */

30 for (int i=0; i<=NumPlayers; i++) {
31      // I believe this is where dimension error comes vPlayerHand[0].push_back
32      // I tried vPlayerHand.push_back(vShoe.back()) but get parsing error "No instance of overloaded function.."

        // This line added as per R Sahu.  compiles and runs correctly
32a     vPlayerHand.push_back(std::vector<Card>());
33      vPlayerHand[0].push_back(vShoe.back()); //Top card in Shoe (last card in vector) is dealt to Player
34      vShoe.pop_back();                       //Top card in Shoe is removed (destroyed) from vector Shoe
35      vDealerHand.push_back(vShoe.back());    //Top card in Shoe (last card in vector) is dealt to Dealer
36      vShoe.pop_back();                       //Top card in Shoe is removed (destroyed) from vector Shoe
37      }
38 
39 /* Show Results
40  std::cout << "\n---------------------------------\n" ;
41  std::cout << "   Players Hand" << std::endl;
42  std::cout << vPlayerHand[0][0].GetRank() << "," << vPlayerHand[0][0].GetSuit() << " ";
43  std::cout << vPlayerHand[0][1].GetRank() << "," << vPlayerHand[0][1].GetSuit() << std::endl;
44 */
45 }

أي فكرة ستكون مفيدة.

هل كانت مفيدة؟

المحلول

لقد حددت vPlayerHand مثل:

std::vector<std::vector<Card>> vPlayerHand;

عندما تستخدم vPlayerHand.push_back(arg), arg يجب أن يكون من النوع std::vector<Card> أو قابلة للتحويل إلى std::vector<Card>.حجة من النوع Card لا يمكن استخدامها كوسيطة لهذه الوظيفة.هذا ما تحاوله عند الاستخدام

vPlayerHand.push_back(vShoe.back())

ما تحتاجه هو:

vPlayerHand.push_back(std::vector<Card>());
vPlayerHand.back().push_back(vShoe.back());
vShoe.pop_back();
vPlayerHand.back().push_back(vShoe.back());
vShoe.pop_back();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top