如何打印结构数组的元素?

How to print the elements of an array of structures?

我是 c++ 的新手,我正在尝试使用数组打印结构的字段。

我知道编译器无法理解行 for(int x:deck[1]) 中 deck[1] 中的内容,因为 deck[1] 是未知数据类型(定义为 [=18= 的结构数据类型) ]).所以 x 无法扫描此数据类型中的元素。

我想知道如何打印此牌组中的元素[1],即 {1,1,1}。

#include <iostream>
using namespace std;

struct card
{
    int face;
    int shape;
    int color;
};

int main()
{
    
    struct card deck[52];
    
    deck[1].face=1;
    deck[1].shape=1;
    deck[1].color=1;
    
    cout<< sizeof(deck)<<endl;
    
    for(int x:deck[1])
    {
        cout<<x<<endl
    }

    return 0;
}

有很多方法可以做到这一点。这里有两种方法。

1.

cout << deck[1].face << " " << deck[1].shape << " " << deck[1].color << endl;
  1. 重载 << 运算符以支持打印 cardcout:
std::ostream &operator<<(std::ostream &os, card const &c) { 
    return os << c.face << " " << c.shape << " " << c.color << endl;
}

那你就可以了

cout << deck[1] << endl;

请注意,您不能遍历 class 类型 对象的数据成员,例如 card。您只能 单独 打印出数据成员。所以可以使用运算符重载来达到想要的效果。特别是,您可以重载 operator<<,如下所示。

#include <iostream>

struct card
{
    int face;
    int shape;
    int color;
    
    //overload operator<<
    friend std::ostream& operator<<(std::ostream &os, const card& obj);
};

std::ostream& operator<<(std::ostream &os, const card& obj)
{
    os << obj.face << " " << obj.shape << " " << obj.color;
    return os;
}

int main()
{ 
    card deck[52] = {};
    
    deck[1].face = 1;
    deck[1].shape = 1;
    deck[1].color = 1;
    
    std::cout << deck[1].face << " " << deck[1].shape << " " << deck[1].color << std::endl;
    
    //use overloaded operator<<
    std::cout << deck[1] << std::endl;\
}

上面程序的输出可见here:

1 1 1
1 1 1

我可能会添加一个方法来获取 card 对象的字符串表示形式:

#include <sstream>

struct card
{
    // ...
    std::string toString() const
    {
        std::stringstream str;
        str << "card[face=" << face << ", shape=" << shape << ", color=" << color << ']';
        return str.str();
    }
};

然后打印结果:

int main()
{
    // ...
    std::cout << deck[1].toString() << '\n';
    // ...
}

(请注意,我使用 '\n' 而不是 std::endl,因为 std::endl 会刷新输出缓冲区,这会对性能产生轻微影响。)

您还可以重载 operator<< 以删除 toString() 方法调用:

std::ostream& operator<<(std::ostream& os, const card& c)
{
    return os << c.toString();
}

如果您真的想要将您的card对象视为一个数组,现在您可能可以做一些指针黑客攻击,但我不推荐它作为这样的解决方法通常会导致代码更混乱、更不安全。

https://en.cppreference.com/w/cpp/io/basic_stringstream https://en.cppreference.com/w/cpp/language/operators#Stream_extraction_and_insertion