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

问题描述:

我是新来的结构,我挣扎了一下。 我有以下结构:结构 - 表达式必须是一个可修改的值

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'}; 
+0

元素的类型是什么? –

+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

您不能使用语法来初始化数组定义之外的数组。您必须手动填写所有值。

幸运的是有标准的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的编译器。

+0

如果我这样做: CHAR_t bId [10] = {'0','0','0','0','0','0','0','0',' '0', '1'}; element.bWpId = bId; – user2633954

+0

@ user2633955不,你只是不能在声明后分配给数组。另一方面,你可以从一个拷贝到另一个,但是,像'std :: copy(std :: begin(bld),std :: end(bld),std :: begin(element.bWpId));' –

+0

没有办法用相应的值初始化它吗? – 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');