簡體   English   中英

為什么我不能像往常一樣初始化typedef結構字符串或char?

[英]Why can't I initialize a typedef struct string or char as normally?

我是編程和C ++的初學者。

在Linux上進行編程,我正在創建一個typedef結構,如下所示:

typedef struct {

    char id[10];
    string name[20];    

}Employee;

通常,當不使用struct時,我將字符串char初始化為:

char id[10]="ID02093";
string name="Joe";

因此,為什么不能按如下所示初始化Employee結構的char id和字符串名稱?:

Employee salesManager;
salesManager.id="ID02093";
salesManager.name="Joe";

我從g ++編譯器收到此錯誤:

“在將'const char [8]'分配給'char [9]'salesManager.id =“ ID02093”時不兼容的類型;” 將'const char [4]'分配給'std :: __ cxx11 :: string [20] {aka std :: __ cxx11 :: basic_string [20]}'salesManager.name =“ Joe”;中的類型不兼容

從typedef結構聲明中初始化typedef結構元素的字符串和char的正確方法是什么?

初始化和賦值是兩個截然不同(但相似)的事物。

您可以通過在聲明/定義數組時為其提供值來初始化數組。

您不能分配給數組。

您可以使用memcpystrcpy 復制到數組中:

char name[20];
strcpy(name, "Test";

但是出於您的目的,您可以將數組初始化為結構初始化的一部分:

typedef struct {
    char id[10];          
    char name[20];
} Employee;
Employee salesManager = {
    "A12345678",
    "Test"
};
/* OR */
Employee salesManager = {
    .id = "A12345678",
    .name = "Test"
};  

由於您在問的是C ++而不是C,因此最好使用std::string而不是原始字符數組。 std::string更加靈活:您可以將值(包括字符串文字)分配給std::string對象。

我認為在兩種情況下都應使用字符串,並使用OOP而不是typedef。 但是嘗試下面的代碼,應該可以正常工作:

#include <iostream>

using namespace std;

typedef struct {

    string id;
    string name;    

} Employee;


int main() {
    Employee salesManager;
    salesManager.id = "A12345678";
    salesManager.name = "Test";

    cout << "Id: " << salesManager.id << endl;
    cout << "Name: " << salesManager.name << endl;

    return 0;
}

您不能分配給char數組

考慮這一行:

 salesManager.id="ID02093"; 

允許使用字符串文字初始化char數組,這是從C繼承的C ++語法所允許的一種方便。但是,不允許將賦值與數組一起使用。 這就是為什么出現此錯誤的原因:

incompatible types in assignment of 'const char [8]' to 'char [9]' salesManager.id="ID02093";

相反,您必須將數據復制到陣列中。

您不能分配給string數組

考慮這條線

 salesManager.name="Joe"; 

失敗的原因是因為您還聲明了name為數組。

 typedef struct { char id[10]; string name[20]; }Employee; 

這說明了為什么出現此錯誤:

incompatible types in assignment of 'const char [4]' to 'std::__cxx11::string [20] {aka std::__cxx11::basic_string [20]}' salesManager.name="Joe";

您可能並不打算將name聲明為數組。

避免使用匿名類

賦予匿名類類型的typedef名稱與類名稱的語義略有不同。 由於區別很棘手,因此如果類本身不包含匿名類,則最好避免使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM