结构 - 表达式必须是可修改的值

时间:2013-08-19 10:09:22

标签: c++ struct

我是结构新手,我有点挣扎。 我有以下结构:

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;

现在每个航路点都是航点列表中的一个元素,它也是一个结构。

class CWaypointList
{
    private:
        sWaypointList WaypointList;
}

现在我的问题是如何在没有编写访问器的情况下读取结构的每个元素中的值?访问器是访问私有结构中数据的唯一方法吗?

如果我这样做,我得到错误:表达式必须是可修改的值。:

 element.bWpId = {'0','0','0','0','0','0','0','0','0','1'};

3 个答案:

答案 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的编译器。

答案 1 :(得分:0)

在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>,然后您就可以随时列出 - 初始化它。

答案 2 :(得分:0)

我使用了sprintf(element.bId,'0');