2016-04-06 114 views
1

当我试图用卡片结构填充我的卡片套牌时,我得到的错误是以上。有没有人对我做错了什么有什么建议?我很困惑为什么我的fillDeck函数说,“从不兼容类型'const char *'分配给'char *'

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#define CARDS 52 
#define FACES 13 
#define SUITS 4 
using namespace std; 

typedef struct card 
{ 
    char * face; 
    char * suit; 
}Card; 
void fillDeck(Card * const wDeck, const char *wFace[], const char *wSuit[]); 
void shuffle(Card * const wDeck); 
void deal(const Card * const wDeck); 

int main(void) 
{ 
    Card deck [CARDS]; 
    const char * face[] = {"Ace", "Two", "Three", "Four", "Five", 
      "Six", "Seven", "Eight", "Nine", "Ten", 
      "Jack", "Queen", "King"}; 
    const char * suit[] = {"Hearts", "Diamonds", "Clubs", "Spades"}; 
    srand(time(NULL)); 
    fillDeck(deck, face, suit); 
    shuffle(deck); 
    deal(deck); 
} 
void fillDeck(Card * wDeck, const char * wFace[], const char * wSuit[]) 
{ 
    int i; 
    for (i = 0; i< CARDS; i++) 
    { 
     wDeck[i].face = wFace[i % FACES]; 
     wDeck[i].suit = wSuit[i/FACES]; 
    } 
} 

回答

2
wDeck[i].face = wFace[i % FACES]; 

突击测验:

问:什么是wDeck

答:这是一个Card类实例。

问:什么是“脸”成员?

答:这是一个char *

问:什么在WFace阵列?

答:const char * s。

问:为什么在C++中,您不能将指向常量对象的指针指向可变(非常量)对象的指针?

答:因为一个常数对象是很好的常量。但是如果你有一个指向它的指针,并且你将这个指针复制到一个不同的可变指针,这意味着你可以使用不同的可变指针来修改这个常量值。

现在,你现在怎么回答你自己的问题?

2

您正试图将const char*分配给char*变量。这是因为你宣布Card作为

typedef struct card 
{ 
    char* face; // <- non const char* 
    char* suit; // <- non const char* 
} Card; 

,并宣布wDeck作为

Card * wDeck // <- non const Card* 

,并宣布wFace作为

const char * wFace[] // <- const char* 

当您尝试分配

wDeck[i].face = wFace[i % FACES]; 

wDeckfaceconst,但wFace包含const char *指针,所以你是一个非const struct的非const char*场分配const char*。您不能将常量指针指定给非常量指针。

此外,这段代码看起来比C++更加C:

  • 你不需要typedef struct cardstruct Card就够了;您应该使用std::vectorstd::array而不是纯C数组。

最后我没有看到使用字符串来引用特定卡片的观点,这在概念上是不正确的。更好的方法是这样的:

enum class Face { 
ACE, 
TWO, 
... 
}; 

enum class Suit { 
HEARTS, 
CLUBS, 
.. 
} 

class Card { 
private: 
    const Face face; 
    const Suit suit; 
public: 
    Card(Face face, Suit suit) : face(face), suit(suit) { } 
    std::string getName() const { ... } 
}; 

如果你要使用C++则试图利用其功能,否则是没有意义的使用C++的。

相关问题