#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 , и закрепил его в багажнике. Неправильное поведение одного компилятора не является причиной для ложных заявлений о языке в целом.