Ошибка C при добавлении информации о персонаже внутри структуры

#c #struct

#c #struct

Вопрос:

Я работал над созданием структуры на C , но при попытке добавить нового человека внутри структуры появляется ошибка. Он просто показывает эту строку ошибки: main.cpp:14:42: error: could not convert '{"Marko", 27}' from '<brace-enclosed initializer list>' to 'Person'

Не могли бы вы сказать мне, что я здесь сделал не так?

 #include <iostream>

using namespace std;

struct Person {
    char name[50];
    int age;
    Person* next;
};


int main()
{
    Person* per1 = new Person({"Marko", 27});
    cout << per1 << endl;
}
 

Комментарии:

1. new Person({"Marko", 27}) —> new Person{"Marko", 27} . Инициализация в C сложна

2. Похоже, ваш выбор компилятора неверен. Ваш код компилируется в clang , но не компилируется в gcc.

3. @MikeCAT — Или это правильно , поскольку это указывает OP на написание более переносимого кода.

4. @StoryTeller-UnslanderMonica Это не будет иметь большого значения. (Я получил почти такой же результат от gcc и clang)

5. Ваш компилятор определенно говорит больше, чем «ошибка: не удалось преобразовать».

Ответ №1:

Обновление: согласно комментариям, это, похоже, ошибка gcc. Ожидайте, что правильное поведение будет доступно в GCC 11.

На данный момент вы можете обойти это с помощью конструктора:

     Person(const char* n, int a, Person* p): age(a), next(p) {
        strncpy(name, n, strlen(n));
        name[strlen(n)] = '';
    }
 

Кроме того, не забывайте delete new о выделенной памяти ly:

     Person* per1 = new Person{"Marko", 27, nullptr};
    cout << per1->name << endl;
    delete per1;
 

Вы также пытаетесь обратиться operator<< к Person . Чтобы «распечатать» Person , вам необходимо перегрузить этот оператор:

 ostreamamp; operator<<(ostreamamp; out, const Personamp; p) {
    return out << "Name: " << p.name << ", Age: " << p.age;
}
 

Убедитесь, что определение находится за пределами структуры.

Тогда в main вы будете использовать его следующим образом:

 cout << *per1 << 'n';
 

Обратите внимание на разыменование per1 . Потому per1 что это указатель, и вы хотите напечатать данные, на которые указывают, а не адрес этих данных.

В целом, это выглядит примерно так:

 #include <iostream>
#include <cstring>

using namespace std;

struct Person {
    char name[50];
    int age;
    Person* next;
    Person(const char* n, int a, Person* p): age(a), next(p) {
        strncpy(name, n, strlen(n));
        name[strlen(n)] = '';
    }
};

ostreamamp; operator<<(ostreamamp; out, const Personamp; p) {
    return out << "Name: " << p.name << ", Age: " << p.age;
}

int main()
{
    Person* per1 = new Person{"Marko", 27, nullptr};
    cout << *per1 << 'n';
    delete per1;
}
 

Комментарии:

1. Да, вы можете написать это на C и ожидать, что это сработает. Мы можем делать это уже около 10 лет.

2. @StoryTeller-UnslanderMonica если вы так утверждаете, почему он не компилируется без ctor?

3. @AveMilia Но это так (начиная с C 11 и далее): godbolt.org/z/6cjzb9

4. @TedLyngmo единственный gcc, на котором он компилируется, — это trunk. Я протестировал все последние основные версии вплоть до gcc 4.

5. Действительно. Хорошо, что люди из GCC знают, что у них есть ошибка gcc.gnu.org/bugzilla/show_bug.cgi?id=90926 , и закрепил его в багажнике. Неправильное поведение одного компилятора не является причиной для ложных заявлений о языке в целом.