Re: Питання щодо Linked List
ви ходите по дуже тонкому льоду.
union MyLinkedList { // Чому `union`??? /* Яка роль цих структур? Для чого вони? Це якийсь особливий прийом обфускації?) static struct C { // І чому тут `static`? int const v; C const *const p, *const n; }; struct { int const length; C const *const tail, *const head; }; */
Бо union кладе 2+ структури даних в ту саму память. Я зробив так що: перша для публічного читаня, друга для приватного rw. Це зручно, коли хочеш виводити вміст без ризику перезапису.
А static я просто забув потерти після купи помилок компіляції. Так, його там не мало бути.
// Об'єкт `o` (він же член класу), ще не розпочав час свого життя. // Коли ініціалізація `o({ 0, &o, &o })` виконується, об'єкт `o` ще не ініціалізовано, // і взяття його адреси або використання для самоініціалізації є невизначеною поведінкою. // Це тому, що `o` використовується до завершення його ініціалізації. MyLinkedList() : o({ 0, &o, &o }) { }
Час життя може й не почав, але память під нього вже виділена, значить адресу вже має.
Стосовно само-ініціалізації: загалом так, але в даному випадку я тільки беру адресу, це не заважає процесу ініціалізації.
Якщо треба буде брати поля з o, тоді треба перенести в { } :
MyLinkedList() { o = { 0, &o, &o }; }
MyLinkedList(int v) { o = { v, &o.p, &o.n }; }
N *getNode(int i) { int c = l + 1 // << UB, спроба прочитати неактивний мембер `l` юніона. ... } void addAfterNode(N *p, int v) { ... ++l; // << UB, спроба прочитати неактивний мембер `l` юніона. } void deleteNode(N *x) { --l; // Теж саме, в інших функціях ті ж проблеми з активними/неактивними мемберами. ...; } ...
Чому не активний, дуже навіть активний. Я ж не просто так там 0 ставив
MyLinkedList() : o({ 0, &o, &o }) { }
Моя початкова ідея була така: зациклити вузли щоб не перевіряти nullptr.
Але коли я переписав на template, то від такого циклу довелось відмовитись. Тепер маю класичний список в 2 кінці.
використав розумний вказівник, бо в усіх підручниках кажуть, що сирі не варто використовувати взагалі.
Прям в всіх ? А, мабуть із тих, які були прочитані. Тоді рекомендую закрити книгу і відкрити документацію.