首页 > 解决方案 > 为什么我收到“表达式必须具有类类型”错误?(C++)

问题描述

wDeck,在下面的代码中给了我一个"expression must have a class type"错误。我已经wDeck在大多数其他代码中进行了澄清void fillDeck(Card* wDeck, void shuffle(Card* wDeck), void deal( Card wDeck[][13]))

我不明白

我没有尝试太多,因为我只有 C++ 的基本知识

我使用 Visual Studio 2019,企业版

#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
using namespace std;

struct Card {
    char *face;
    char *suit;
};

void shuffle(int[][13]);
void deal(const int[][13], const char* [], const char* []);
void fillDeck(Card*, char* [], char* []);


int main() {
    const char* suit[4] =
    { "Hearts", "Diamonds", "Clubs", "Spades" };
    const char* face[13] =
    {
        "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King" };
    int deck[4][13] = { 0 };

    srand(time(0));

    shuffle(deck);
    deal(deck, face, suit);

    return 0;
}

void fillDeck(Card* wDeck, char* wFace[], char* wSuit[])
{
    for (int i = 0; i < 52; i++) {
        wDeck[i].face = wFace[i % 13];
        wDeck[i].suit = wSuit[i / 13];
    }
}

void shuffle(Card* wDeck)
{
    for (int i = 0; i < 52; i++) {
        int j = rand() % 52;
        Card temp = wDeck[i];
        wDeck[i] = wDeck[j];
        wDeck[j] = temp;
    }
}

void deal( Card wDeck[][13])
    {
        for (int i = 0; i < 52; i++)
            cout << setiosflags(ios::right)
            <<setw(5) << wDeck[ i ].face << " of "
            <<setiosflags(ios::left)
            <<setw(8) << wDeck[ i ].suit
            <<( ( i + 1 ) % 2 ? '\t': '\n' );
    }```

标签: c++

解决方案


在这段代码中

    void deal( Card wDeck[][13])
    {
        for (int i = 0; i < 52; i++)
            cout << setiosflags(ios::right)
            <<setw(5) << wDeck[ i ].face << " of "
            <<setiosflags(ios::left)
            <<setw(8) << wDeck[ i ].suit
            <<( ( i + 1 ) % 2 ? '\t': '\n' );
    }

您定义 wDeck[][13]为多维数组,然后您尝试将其作为一维数组访问

 wDeck[ i ]

它的作用如下:

在第一次迭代中,结果wDeck[ 0 ]是另一个数组,在您的情况下,它有 13 个元素 wDeck[i] 不是类或结构,它是一个数组,因此它没有成员函数。

它在您的代码中得到了回答 ,您可以在代码中替换这里然后 您可以看到你们俩是如何犯同样的错误的,所以现在您正在尝试使用 struct 成员指针访问一个包含 13 个元素的数组。因此你得到同样的错误arrayTestwDeck[i]

你需要的是使用嵌套循环

for (int i = 0; i < 4; i++)
{
 for (int j =0 ; j<13 ;j++)
{
 cout << setiosflags(ios::right)
            <<setw(5) << wDeck[ i ][j].face << " of "
            <<setiosflags(ios::left)
            <<setw(8) << wDeck[ i ][j].suit
            <<( ( i + 1 ) % 2 ? '\t': '\n' );
}
}

这段代码的作用是,它遍历数组 wDeck[] 的第一层(我认为您在阅读代码后将此数组定义为 4),结果将是第二层的数组(我可以看到您定义了它如 13),然后遍历数组的第二层,然后得到一个 Card 类型的对象,您可以在其中使用它的成员和函数(如果有)

我认为您可能需要了解有关多维数组和嵌套循环的更多信息

原谅我的英语


推荐阅读