繁体   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