c++ - 为什么我收到 "Expression must have a class type"错误? (C++)

标签 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' );
    }```

最佳答案

在这段代码中

    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] 不是类或结构,它是一个数组,因此它没有成员函数。

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

你需要的是使用嵌套循环

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 类型的对象,你可以在其中使用它的成员和函数,如果它有的话

我认为你可能需要更多地了解多维数组和嵌套循环

请原谅我的英语

关于c++ - 为什么我收到 "Expression must have a class type"错误? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56248853/

相关文章:

c++ - map 内容未以特定方式打印

c++ - 在 C++ 中输出分配给 double 组中的元素的字符串

c# - 通过 COM 为 C++ 客户端公开 C#

c++ - 为什么 GoogleMock 会泄露我的 shared_ptr?

c++ - STL栈和双端队列之间的转换

c++ - lua_call(S, 0, 0) 不起作用(试图调用一个字符串值)?

c++ - 重载赋值运算符的类的深拷贝

c++ - 从 GetAdaptersAddresses 返回的 ERROR_INSUFFICIENT_BUFFER

c++ - 使用 C++ 可变参数模板,如何存储一组异构类型的对象并迭代它们?

c++ - 可以使用带有 boost 的 C++ 匿名函数吗?