2

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

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'};
4

3 回答 3

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

于 2013-08-19T10:11:54.750 回答
0

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

于 2013-09-18T08:28:27.067 回答
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 编译器。如果有,只需将其更改bWpIdstd::array<Char_t, 10>,然后您可以随时列出初始化它。

于 2013-08-19T11:01:55.827 回答