Почему я не могу инициализировать структурную строку typedef или char как обычно? - PullRequest
0 голосов
/ 19 февраля 2019

Я новичок в программировании и C ++.

Программируя в Linux, я создаю структуру typedef, как показано ниже:

typedef struct {

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

}Employee;

Обычно, когда не используется struct, я инициализирую строкувыполнение символа:

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

Итак, почему я не могу инициализировать идентификатор и строковое имя структуры Employee, как показано ниже:

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?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Инициализация и присваивание - это две разные (но похожие) вещи.

Вы можете инициализировать массив, указав для него значение при его объявлении / определении.

Вы не можете присвоитьмассив.

Вы можете скопировать значение в массив, используя memcpy или strcpy:

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.

0 голосов
/ 20 февраля 2019

Вы не можете присвоить массиву 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 массивом.

Избегайте использования анонимных классов

A typedef Имя, данное анонимному типу класса, имеет слегка отличную семантику от имени класса.Поскольку различия хитры, лучше избегать использования анонимных классов, если они не содержатся внутри самого класса.

0 голосов
/ 19 февраля 2019

Я думаю, что вы должны использовать строку в обоих случаях и использовать 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;
}
...