2015-10-27 3 views
1

Я новичок здесь, поэтому надеюсь, что все сделаю правильно. Проблема: я наблюдал за Lynda.com C++ Tutorial с Биллом Вайнманом, и есть пример кода, который выводит все карты из обычной покерной колоды. Структура определяет одну карту, и массив содержит каждые 52 карты. Код работает, если все написано в основном классе. Моя проблема состоит в том, чтобы разделить этот код и поместить его в дополнительный класс. Я не знаю почему.Как вызвать функцию, которая выводит массив структур в отдельном классе?

#include <cstdio> 
#include <iostream> 

//#include "Cards.h" 
using namespace std; 


struct card{ 
    unsigned int rank; 
    unsigned int suit; 
}; 

enum card_suit { HERZ, KARO, PIK, KREUZ }; 
enum card_rank { ASS = 1, BUBE = 11, DAME = 12, KOENIG = 13 }; 

const char * assString = "Ass"; 
const char * bubeString = "Bube"; 
const char * dameString = "Dame"; 
const char * koenigString = "Koenig"; 
const char * herzString = "Herz"; 
const char * karoString = "Karo"; 
const char * pikString = "Pik"; 
const char * kreuzString = "Kreuz"; 


card deck[52] = { 
     { ASS, HERZ }, { 2, HERZ }, { 3, HERZ }, { 4, HERZ }, { 5, HERZ }, { 6, HERZ }, 
     { 7, HERZ }, { 8, HERZ }, { 9, HERZ }, { 10, HERZ }, { BUBE, HERZ }, { DAME, HERZ }, { KOENIG, HERZ }, 
     { 1, KARO }, { 2, KARO }, { 3, KARO }, { 4, KARO }, { 5, KARO }, { 6, KARO }, 
     { 7, KARO }, { 8, KARO }, { 9, KARO }, { 10, KARO }, { 11, KARO }, { 12, KARO }, { 13, KARO }, 
     { ASS, PIK }, { 2, PIK }, { 3, PIK }, { 4, PIK }, { 5, PIK }, { 6, PIK }, 
     { 7, PIK }, { 8, PIK }, { 9, PIK }, { 10, PIK }, { BUBE, PIK }, { DAME, PIK }, { 13, PIK }, 
     { ASS, KREUZ }, { 2, KREUZ }, { 3, KREUZ }, { 4, KREUZ }, { 5, KREUZ }, { 6, KREUZ }, 
     { 7, KREUZ }, { 8, KREUZ }, { 9, KREUZ }, { 10, KREUZ }, { BUBE, KREUZ }, { 12, KREUZ }, { 13, KREUZ } 
}; 

void printCards(const card & c){ 
    switch (c.suit){ 
    case HERZ: 
     printf("%s ", herzString); 
     break; 
    case KARO: 
     printf("%s ", karoString); 
     break; 
    case PIK: 
     printf("%s ", pikString); 
     break; 
    case KREUZ: 
     printf("%s ", kreuzString); 
     break; 
    } 
    if (c.rank >= 2 && c.rank <= 10){ 
     printf("%d\n", c.rank); 
    } 
    else { 
     switch (c.rank){ 
     case ASS: 
      printf("%s\n", assString); 
      break; 
     case BUBE: 
      printf("%s\n", bubeString); 
      break; 
     case DAME: 
      printf("%s\n", dameString); 
      break; 
     case KOENIG: 
      printf("%s\n", koenigString); 
      break; 
     } 
    } 

} 


int main(int argc, char ** argv) { 

    for (auto & c : deck){ 
     printCards(c); 
    } 

    system("PAUSE"); 

    return 0; 
} 

Так вот что я сделал:

главный класс:

#include <cstdio> 
#include <iostream> 

#include "Cards.h" 
using namespace std; 

int main(int argc, char ** argv) { 
    Cards poker; 

    for (auto & c : poker.deck){ 
     poker.printCards(c); 
    } 
    system("PAUSE"); 
    return 0; 
} 

Cards.h

#pragma once 
#include <cstdio> 
#include <string> 

using namespace std; 

struct card{ 
    unsigned int rank; 
    unsigned int suit; 
}; 

class Cards 
{ 
public: 
    Cards(); 
    ~Cards(); 

    enum card_suit { HERZ, KARO, PIK, KREUZ }; 
    enum card_rank { ASS = 1, BUBE = 11, DAME = 12, KOENIG = 13 }; 

    const char * assString = "Ass"; 
    const char * bubeString = "Bube"; 
    const char * dameString = "Dame"; 
    const char * koenigString = "Koenig"; 
    const char * herzString = "Herz"; 
    const char * karoString = "Karo"; 
    const char * pikString = "Pik"; 
    const char * kreuzString = "Kreuz"; 

    card deck[52] = { 
      { ASS, HERZ }, { 2, HERZ }, { 3, HERZ }, { 4, HERZ }, { 5, HERZ }, { 6, HERZ }, 
      { 7, HERZ }, { 8, HERZ }, { 9, HERZ }, { 10, HERZ }, { BUBE, HERZ }, { DAME, HERZ }, { KOENIG, HERZ }, 
      { 1, KARO }, { 2, KARO }, { 3, KARO }, { 4, KARO }, { 5, KARO }, { 6, KARO }, 
      { 7, KARO }, { 8, KARO }, { 9, KARO }, { 10, KARO }, { 11, KARO }, { 12, KARO }, { 13, KARO }, 
      { ASS, PIK }, { 2, PIK }, { 3, PIK }, { 4, PIK }, { 5, PIK }, { 6, PIK }, 
      { 7, PIK }, { 8, PIK }, { 9, PIK }, { 10, PIK }, { BUBE, PIK }, { DAME, PIK }, { 13, PIK }, 
      { ASS, KREUZ }, { 2, KREUZ }, { 3, KREUZ }, { 4, KREUZ }, { 5, KREUZ }, { 6, KREUZ }, 
      { 7, KREUZ }, { 8, KREUZ }, { 9, KREUZ }, { 10, KREUZ }, { BUBE, KREUZ }, { 12, KREUZ }, { 13, KREUZ } 
    }; 
    void printCards(const card & c); 
}; 

Cards.cpp

#include "Cards.h" 

Cards::Cards() 
{ 

} 

Cards::~Cards() 
{ 
} 

void Cards::printCards(const card & c){ 
    switch (c.suit){ 
    case HERZ: 
     printf("%s ", herzString); 
     break; 
    case KARO: 
     printf("%s ", karoString); 
     break; 
    case PIK: 
     printf("%s ", pikString); 
     break; 
    case KREUZ: 
     printf("%s ", kreuzString); 
     break; 
    } 
    if (c.rank >= 2 && c.rank <= 10){ 
     printf("%d\n", c.rank); 
    } 
    else { 
     switch (c.rank){ 
     case ASS: 
      printf("%s\n", assString); 
      break; 
     case BUBE: 
      printf("%s\n", bubeString); 
      break; 
     case DAME: 
      printf("%s\n", dameString); 
      break; 
     case KOENIG: 
      printf("%s\n", koenigString); 
      break; 
     } 
    } 
} 

Я знаю, это действительно длинный код, но я не знаю, где его уменьшить. В конце концов есть эта ошибка:

Error 1 error C2536: 'Cards::Cards::deck' : cannot specify explicit initializer for arrays 

я мотыга вы можете помочь мне. Даже если ставить старую перед «колодой», я получаю сообщение об ошибке. Я показал этот код двум людям, и они не могли мне помочь, и я искал на этом сайте, но в большинстве случаев массив структур. Так что это работает, но у меня есть проблема с его разделением.

Благодаря

+0

см. http://stackoverflow.com/questions/23900191/error-cannot-specify-explicit-initializer-for-array – Grv

+0

Спасибо за этот быстрый ответ. Теперь я знаю проблему, но она еще не решена. Если я объявляю массив в конструкторе в файле Cards.cpp и объявляю в файле Cards.h только «card new_deck [52]», выход ошибочен. Там только напечатаны «Герц, Герц, Герц ....» и т. Д. – andishanti

ответ

0

Как говорится в сообщении об ошибке, массивы в стиле C не являются гражданами первого класса в C++ и не может быть инициализирована как это в классе.

Я бы объявил new_deck вне класса и скопировал его в конструкторе класса.

+0

Спасибо! Поэтому я объявил в Card.h, но внутри класса Cards (потому что снаружи есть ошибка) 'card new_deck [52];' и в Card.cpp я объявил массив со всеми картами. Поэтому в основном я написал это 'for (auto & c: poker.new_deck) {poker.printCards (c);}', и это дает мне неправильный результат. Я не могу объяснить, почему ... Спасибо за помощь! – andishanti

0

Вы не можете назначать значения переменным внутри определения класса (как вы это делаете с массивом карт, строками). Вам нужно создать .cpp-файл для вашего класса и инициализировать эти переменные в конструкторе этого класса.

Даже если вы используете статические переменные, вы должны объявить их вне класса и присвоить им значение.

+0

Спасибо за быстрый ответ. Я понимаю проблему. Немного грустно, что в учебнике содержится так много материала C ... Итак, если я объявляю его в конструкторе, ошибки нет, но результат неправильный. «Герц, Герц, Герц ...» и так далее. – andishanti

+0

@andishanti Итак, вы сделали: a) переместили объявление целого массива в конструктор, или b) перенесли только экземпляр массива в конструктор? –

+0

Извините за путаницу.Я переместил всю инициализацию массива в конструктор, но оставил объявление 'card new_deck [52];' в файле заголовка. – andishanti

Смежные вопросы