如何打印结构数组的元素?
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;
- 重载
<<
运算符以支持打印 card
到 cout
:
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
我是 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;
- 重载
<<
运算符以支持打印card
到cout
:
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