结构 - 表达式必须是一个可修改的值
我是新来的结构,我挣扎了一下。 我有以下结构:结构 - 表达式必须是一个可修改的值
typedef struct
{
CHAR_t bWpId[10];
CHAR_t bWpDescr[25];
UINT16_t wCoA;
sUtmCoordinate_t Coordinate;
} sWaypoint_t;
typedef struct
{
sWaypointListElement Element[cMAX_WAYPOINTS];
UINT8_t bHead;
UINT8_t bTail;
UINT8_t bNumElements;
} sWaypointList;
现在每个路点是在一个waypointlist这也是一个结构的元件。
class CWaypointList
{
private:
sWaypointList WaypointList;
}
现在我的问题是我如何读取结构的每个元素中的值而不写入访问器?访问器是访问私有结构中数据的唯一方式吗?
如果我不喜欢这样,我得到的错误:表达式必须是一个可修改:
element.bWpId = {'0','0','0','0','0','0','0','0','0','1'};
您不能使用语法来初始化数组定义之外的数组。您必须手动填写所有值。
幸运的是有标准的C++函数来做到这一点的使用,像std::fill
:
std::fill(std::begin(element.bWpId), std::end(element.bWpId), '0');
element.bWpId[9] = '1';
当然你可以做的sWaypoint_t
结构的构造,并且在初始化数组:
typedef struct sWaypoint_s
{
CHAR_t bWpId[10];
CHAR_t bWpDescr[25];
UINT16_t wCoA;
sUtmCoordinate_t Coordinate;
sWaypoint_s()
: bWpId{'0','0','0','0','0','0','0','0','0','1'}
{}
} sWaypoint_t;
问题在于它需要支持C++ 11的编译器。
如果我这样做: CHAR_t bId [10] = {'0','0','0','0','0','0','0','0',' '0', '1'}; element.bWpId = bId; – user2633954
@ user2633955不,你只是不能在声明后分配给数组。另一方面,你可以从一个拷贝到另一个,但是,像'std :: copy(std :: begin(bld),std :: end(bld),std :: begin(element.bWpId));' –
没有办法用相应的值初始化它吗? – user2633954
在C++中,您无法列出初始化已经构建的数组。同样适用于列表初始化结构。
使用std::fill
是一种方法,但我不喜欢它的默默无闻。相反,你可以尝试使用这个帮手功能:
template <class T, size_t Size>
void copy_array(T (&dst)[Size], const T (&src)[Size])
{
std::copy(src, src+Size, dst);
}
现在你可以“分配”任何数组。在element.bWpId
情况:
CHAR_t temp[] = {'0','0','0','0','0','0','0','0','0','1'};
copy_array(element.bWpId, temp);
功能将编译时间检查数组类型和尺寸,所以它留下了一个错误没有机会。与显式的std :: fill和手动索引相比,这是一个巨大的优势。
提供的所有内容都无法访问C++ 11编译器。如果有,只需将bWpId
更改为std::array<Char_t, 10>
,然后您可以随时列出初始化。
我用sprintf(element.bId,'0');
元素的类型是什么? –
它是sWaypoint_t类型: sWaypoint_t元素; 这是一个结构 typedef结构 { \t CHAR_t bWpId [10]; \t CHAR_t bWpDescr [25]; \t UINT16_t wCoA; \t sUtmCoordinate_t坐标; } sWaypoint_t; – user2633954