结构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 } };
和
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 } };
那么第一个内括号被认为是数组列表初始化的起点。由于结构只有一个数据成员(数组),因此除第一个之外的所有其他列表初始化都没有结构的相应数据成员。所以编译器发出错误。