2016-04-06 4 views
1

カードデッキに額面とスーツのカード構造を記入しようとすると、上記。誰かが私が間違ってやっていることについて何か提案がありますか?私のfillDeck関数が "char *に互換性のないタイプのconst 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]; 

ポップクイズ:

Q:wDeckとは何ですか?

A:Cardクラスインスタンスです。

Q:「顔」メンバーとは何ですか?

A:char *です。

Q:WFaceアレイには何がありますか?

A:const char *s。

Q:なぜC++では、定数オブジェクトへのポインタを、可変(非定数)オブジェクトへのポインタに割り当てることができないのですか?

A:定数オブジェクトは、まあ、定数なので、しかし、ポインタを持っていて、そのポインタを別の可変ポインタにコピーすると、異なる可変ポインタを使って定数値を変更できます。

今、あなた自身の質問に答えようとしていますか?

2

const char*char*変数に割り当てようとしています。あなたは

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

としてCardを宣言し、

Card * wDeck // <- non const Card* 

としてwDeckを宣言し、あなたが

wDeck[i].face = wFace[i % FACES]; 
を割り当てるしようとすると

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

としてwFaceを宣言したためです

wDeckfaceconstではありませんが、wFaceconst char *のポインタが含まれているので、あなたは非const structの非const char*フィールドにconst char*を割り当てています。 constポインタを非constポインタに代入することはできません。また

、このコードはC++よりもはるかに多くのCのようになります。

  • あなたはstruct Cardが十分である、typedef struct cardは必要ありません。

  • プレーンC配列の代わりにstd::vectorまたはstd::arrayを使用する必要があります。

最後に、特定のカードを参照するために文字列を使用する点はありませんが、これは概念的に正しいものではありません。それ以外の場合はそれがすべてでC++を使用しても意味がありません、あなたが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 { ... } 
}; 

:より良いアプローチは、ようなものになるだろう。

関連する問題