结构body
是包含数据成员的聚合,而数据成员又是聚合。
你需要写
body r_plate = { { { 0,0 },{ 5,0 },{ 5,1 },{ 0,1 } } };
那是结构体包含一个数组,所以你必须写
body r_plate = { { ... } };
数组的每个元素都是结构体类型的对象。所以你会有
body r_plate = { { { 0,0 },{ 5,0 },{ 5,1 },{ 0,1 } } };
以下初始化的可读性较差,但正确
body r_plate = { { 0,0,5,0,5,1,0,1 } };
and
body r_plate = { 0,0,5,0,5,1,0,1 };
这是一个演示程序。
#include <iostream>
typedef struct coordinate{
double x;
double y;
}point;
typedef struct sc_cell{ // single cell
point sc[4];
}cell;
typedef struct sb_body { // for single body
point sb[4];
}body;
using namespace std;
int main()
{
body r_plate = { 0,0,5,0,5,1,0,1 };
for ( const auto &p : r_plate.sb )
{
std::cout << "( " << p.x << ", " << p.y << " ) ";
}
std::cout << '\n';
r_plate = { { 0,0,5,0,5,1,0,1 } };
for ( const auto &p : r_plate.sb )
{
std::cout << "( " << p.x << ", " << p.y << " ) ";
}
std::cout << '\n';
r_plate = { { { 0,0 }, { 5,0 } , { 5,1 }, { 0,1 } } };
for ( const auto &p : r_plate.sb )
{
std::cout << "( " << p.x << ", " << p.y << " ) ";
}
std::cout << '\n';
return 0;
}
程序输出是
( 0, 0 ) ( 5, 0 ) ( 5, 1 ) ( 0, 1 )
( 0, 0 ) ( 5, 0 ) ( 5, 1 ) ( 0, 1 )
( 0, 0 ) ( 5, 0 ) ( 5, 1 ) ( 0, 1 )
至于这个任务
r_plate = { { 0,0 },{ 5,0 },{ 5,1 },{ 0,1 } };
那么第一个内大括号被视为数组列表初始化的起点。由于该结构只有一个数据成员(数组),因此除了第一个列表初始化之外的所有其他列表初始化都没有该结构的相应数据成员。所以编译器会报错。