inicjowanie obiektu

0

Co muszę zmienić/dopisać żebym mógł tworzyć obiekty Linked_list w sposób jaki zrobiłem to w main.cpp? Dostałem zadanie którego jednym z wymagań jest utworzenie klasy która będzie mogła zostać stworzona jedną lub obiema tymi linijkami kodu (nie wiem czy obie są możliwe jednocześnie).

main.cpp

#include "linked_list.h"
#include <iostream>

using namespace std;

struct Node
{
	int data;
	char data2;
	Node* next;
	Node* previous;
};

int main()
{
	Linked_list<Node>* nowy_obiekt = new Linked_list<Node>();
	Linked_list<Node*>* nowy_obiekt2 = new Linked_list<Node*>();

        delete nowy_obiekt;
	delete nowy_obiekt2;

	return 0;
}

linked_list.h

#define NULL nullptr

template<class T>
class Linked_list
{
	T *head;
	T *tail;
	int size = 0;

public:
	Linked_list();
	~Linked_list();
};

linked_list.cpp

#include "Linked_list.h"

template<class T>
Linked_list<T>::Linked_list()
{
	head = NULL;
	tail = NULL;
}
0

Coś nie działa? Chodzi ci o zmianę typu z Node na Node*?

3

Jeśli te dwie liniki kodu to te:

    Linked_list<Node>* nowy_obiekt = new Linked_list<Node>();
    Linked_list<Node*>* nowy_obiekt2 = new Linked_list<Node*>();

To ktoś wymaga coś dziwnego od ciebie.

Mamy 2020 C++11 powinno być już używane obligatoryjnie!

struct EmpltyListException : std::exception
{
    const char* what() const noexcept override
    {
        return "List is empty";
    }
};

template<typename T>
class LinkedList {
    struct Node {
        template<typename...Args>
        Node(Args...args) : value(std::forward<Args>(args)...)
        {}

        std::unique_ptr<Node> next;
        Node* prev = nullptr;
        T value;
    };

public:
    LinkedList()
    {

    }

    LinkedList(std::initializer_list<T> iniList)
    {
        for (const auto& x : iniList) {
            emplaceBack(x);
        }
    }

    ~LinkedList() {
        clear();
    }

    void clear() {
        // loop version prevents stack overflow which could be caused by simple: head = nullptr;
        for (auto p = std::move(head); p; p = std::move(p->next));
        tail = nullptr;
    }

    template<typename...Args>
    void emplaceFront(Args...args) {
         auto item = std::make_unique<Node>(std::forward<Args>(args)...);
         if (!head) {
            tail = item.get();
         } else {
            head->prev = item.get();
            item->next = std::move(head);
         }
         head = std::move(item);
    }

    template<typename...Args>
    void emplaceBack(Args...args) {
         auto item = std::make_unique<Node>(std::forward<Args>(args)...);
         auto pp = tail ? &tail->next : &head;
         item->prev = tail;
         tail = item.get();
         *pp = std::move(item);
    }

    void forEach(std::function<void(T&)> f)
    {
        for (auto p = head.get(); p; p = p->next.get())
            f(p->value);
    }

    void forEach(std::function<void(const T&)>) const
    {
        for (auto p = head.get(); p; p = p->next.get())
            f(p->value);
    }

    bool empty() const {
        return head == nullptr;
    }

    T& front() {
        thowIfEmpty();
        return head->value;
    }

    const T& front() const{
        thowIfEmpty();
        return head->value;
    }

    T& back() {
        thowIfEmpty();
        return tail->value;
    }

    const T& back() const{
        thowIfEmpty();
        return tail->value;
    }

private:
    void thowIfEmpty() const {
        if (empty()) {
            throw EmpltyListException{};
        }
    }
private:
    std::unique_ptr<Node> head;
    Node* tail = nullptr;
};

https://godbolt.org/z/W68KfP

0

Dziękuję MarekR22 za pomoc. Próbuję coś napisać wzorując się na twoim kodzie i mam problemy z używaniem wskaźników. Link do kodu: https://godbolt.org/z/obGKPr.
screenshot-20201024170302.png

błędy dotyczą kolejno 28, 27, 24 i 27 linii linked_list.h

screenshot-20201024170406.png

main.cpp

screenshot-20201024170437.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1