Lista jednokierunkowa

0

Hej!
Implementuje listę jednokierunkową z wykorzystaniem klasy, wszystko się kompiluje, ale mimo to program nie działa tzn. w oknie konsoli nic się nie wyświetla, ani nic nie można wpisać. Czy mógłby ktoś zerknąć na kod (program 3-plikowy).
Z góry dziękuję!
Lista.h

#ifndef LISTA_H_
#define LISTA_H_
#include <string>
struct List
{
	int how_many;
	std::string animal;
	struct List *next;
};
typedef struct List Item;
void change_list(Item &it);
class Lista
{
	Item *head;

public:
	Lista();
	void add_elem();
	bool is_empty();
	void show_list();
	void Lista::visit(void(*pf)(Item &it));
	~Lista();
};
#endif LISTA_H_

Lista.cpp

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

Lista::Lista()
{
	
	head->animal = "Orka";
	head->next = NULL;
}

void Lista::add_elem()
{
	int nex;
	std::string temp;
	std::cout << "Podaj zwierzatko: " << temp;
	nex = (head->how_many) + 1;
	List *now = new List;
	now->how_many = nex;
	now->animal = temp;
	now->next = head;
	head = now;
}
bool Lista::is_empty()
{
	if (head->next == NULL)
		return true;
	else
		return false;
}
void Lista::show_list()
{
	List *now = head;
	while (now!= NULL)
	{
		std::cout << now->how_many << ". " << now->animal << std::endl;
		now = now->next;
	}
}
Lista::~Lista()
{
}

Lista_main.cpp

#include <iostream>
#include "Lista.h"
using namespace std;
void change_list(Item &it);
int main()
{
	Lista one;
	Item test;
	int n;
	one.add_elem();
	one.show_list();
	cout << "Ile elementow chcesz dodac? ";
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		one.add_elem();
	}
	one.show_list();
	cout << endl;
	//one.visit(change_list);
	one.show_list();
	return 0;
}
0

W konstruktorze oczywiście ma być head->how_many=0;

3

Napisałeś, że piszesz z wykorzystaniem klasy. Pytanie za 100 punktów: gdzie tworzysz obiekt?

1

Nigdzie nie inicjalizujesz head. Ponadto mieszasz warstwę interakcji z użytkownikiem z implementacją listy, nie respektujesz zasady 3/5/0.

0
Haskell napisał(a):

Napisałeś, że piszesz z wykorzystaniem klasy. Pytanie za 100 punktów: gdzie tworzysz obiekt?

Na samym początku main - Lista one;

A head nie powinien byc inicjalizowany przy tworzeniu obiektu i automatycznym wywolaniu konstruktora?

1

Jest, ale domyślna inicjalizacja wskaźnika (bez wchodzenia w szczegóły) nie tworzy obiektu.

0
Ogrodnik napisał(a):

Na samym początku main - Lista one;

Problem w tym, że ja tam żadnego tworzenia obiektu nie widzę. Tam jest jedynie deklaracja zmiennej.

0

@kg mógłbys napisac/wyjasnic jak to poprawnie zrobic w takim razie?

0

Żeby to zrobić poprawnie to w sumie cały kod by trzeba zaorać. Ale chyba sam jesteś w stanie zauważyć różnicę między:

    Item *head;

oraz

    List *now = new List;

head nigdzie nie inicjalizujesz, a oczekujesz, że będzie zainicjalizowane.

BTW: q i g to różne literki.

0

Ahh, a więc o to chodzi, dzięki :)
Jesli poprawię na Item *head=new Item, to co później jeszcze musze zmienic? Sory, że tyle pytan ale dopiero zaczynam swoja przygode z obiektówką

Wiem, wybacz mój błąd z lierkami :)

0

Żeby poprawić ten błąd w konstruktorze wpisz head = new Item;

Przy czym używanie nagiego new i delete w C++ to zły pomysł: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

Przy okazji poczytaj o SRP: https://en.wikipedia.org/wiki/Single_responsibility_principle (klasa listy nie powinna odpytywać się o nic użytkownika ani nie powinna nic wypisywać do konsoli. Co zrobisz jak będziesz chciał jej użyć w aplikacji okienkowej albo webowej?)

0

Ok racja. Dziękuję bardzo za wszelkie cenne wskazówki!

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