2013-08-19 42 views
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; 

現在每個路點是在一個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

回答

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的編譯器。

+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

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>,然後您可以隨時列出初始化。

相關問題