Wyszukiwanie i edytowanie: list <Pojazd*> lista;

0

Witam chciałbym się was zapytać czy moje funkcje wyszukiwania i edycji są poprawne.
Mam KlasęBazową, KlasęPochodną1, KlasęPochodną2 i KlasęPochodnąPochodnej2.
Szukanie:
Tutaj chciałbym zwrócić obiekt, albo wskaźnik na niego żeby móc wykorzystać tą funkcje w funkcji edytuj.

KlasaBazowa Lista::Szukaj()
{
int odp = 0;
jeszczeRaz:
	system("CLS");

	std::cout << "szukaj po: 1.nazwie\n2.ilosci" << endl;
	cin >> odp;

	switch (odp)
	{
	case 1:
	{
		std::string nazw;
		std::cout << "wyszukaj o nazwie:";
		std::cin >> nazw;

		for (auto it : lista)
		{
			if ((it->nazwa).compare(nazw) == 0)
			{
				return *it;
			}
		}
	}
	break;
	case 2:
	{
		int il;
		std::cout << "wyszukaj o ilosci:";
		std::cin >> il

		for (auto it : lista)
		{
			if ((it->ilosc) == il)
			{
				return *it;
			}
		}
	}
	break;
	default:
		std::cout << "Wprowadziles zla opcje, sprobuj jeszcze raz." << endl;
		goto jeszczeRaz;
		break;
	}
}

Funkcja edytuj:

void KlasaBazowa::Edytuj()
{
	auto obiekt = Szukaj();
	obiekt.EdytujDane();
}

Zdaję sobie sprawę że coś tutaj jest nie tak, ale nie wiem co

2
  1. Łamiesz SRP, funkcja Szukaj nie powinna odpytywać o nic. Ponadto masz w bibliotece standardowej std::find_if (oraz std::list<T>::find).
  2. Zwracasz obiekt typu KlasaBazowa, czyli dokonujesz slicingu (tworzysz nowy obiekt klasy KlasaBazowa utworzony z kopii obiektu zawartego w zwracanym elemencie). Zamiast tego prawdopodobnie chcesz zwrócić wskaźnik.
  3. Dziwnie porównujesz stringi. == jest czytelniejsze.
0

Według tego SRP(pierwszy raz to słyszę) funkcja szukaj nie powinna o nic pytać, czy każda funkcja nie powinna o nic pytać?

Jak zastosować funkcje find_if, jeżeli chcę przeszukiwać listę i np jeżeli dwa obiekty mają taką samą nazwę lecz inną ilość i chcę dostać się do tego drugiego? Ta funkcja zwraca iterator czy wskaźnik?
Nie za bardzo wiem jak rozwiązać mój problem.

1

SRP = Single Responsibility Principle

find_if zwraca iterator. Wszystko można przeczytać w dokumentacji: http://en.cppreference.com/w/cpp/algorithm/find

0

A to dla mojego rozwiązania nie będzie lepszym wyborem zwrócenie wskaźnika?
Bo jeżeli chcę edytować obiekt to muszę mieć do niego dostęp, a nie chciałbym powielać opcji szukaj.

1

@kq napisał tworzysz nowy obiekt klasy KlasaBazowa utworzony z kopii obiektu zawartego w zwracanym elemencie). Zamiast tego prawdopodobnie chcesz zwrócić wskaźnik.
To znaczy, że zwracasz wskaźnik do kopii obiektu, a nie do obiektu tak jak byś chciał.

0

bl4ster, dzięki za wyjaśnienie, coś innego zrozumiałem

Trochę poczytałem manuala ale nadal nie wiem jak to zrobić :/
Ktoś mógłby to wytłumaczyć?

0

@bl4ster: Zwracając wskaźnik do obiektu nie wykonujesz kopii obiektu. Więc zwracasz wskaźnik na obiekt o odpowiednim dynamicznym typie.

0

Czyli dobrze zwracam wskaźnik, ale potem źle robię edycję tak?

1

Nie zwracasz wskaźnika. Zwracasz kopię.

0

Dobra jestem trochę tępy, ale chyba dotarło do mnie :D

Czy teraz jest poprawnie?

KlasaBazowa* Lista::Szukaj(int odp)
{

jeszczeRaz:
    system("CLS");

    switch (odp)
    {
    case 1:
    {
        std::string nazw;
        std::cout << "wyszukaj o nazwie:";
        std::cin >> nazw;

        for (auto it : lista)
        {
            if ((it->nazwa).compare(nazw) == 0)
            {
                return it;
            }
        }
    }
    break;
    case 2:
    {
        int il;
        std::cout << "wyszukaj o ilosci:";
        std::cin >> il

        for (auto it : lista)
        {
            if ((it->ilosc) == il)
            {
                return it;
            }
        }
    }
    break;
    default:
        std::cout << "Wprowadziles zla opcje, sprobuj jeszcze raz." << endl;
        goto jeszczeRaz;
        break;
    }
}

Czym jest SRP jeszcze trawię i próbuję dokładnie zrozumieć tego idee i poprawie to później.

1

Chodzi o to, że funkcja szukająca powinna szukać. Nie powinna odpytywać użytkownika poprzez wejście standardowe. Co się stanie gdy będziesz chciał jej użyć w programie okienkowym? W obsłudze żądania http? W obsłudze zdarzenia w bocie ircowym?

0

Aaaaa, czyli powinienem porobić takie interfacy do tego tak?

0

A nie powinno być tak?

KlasaBazowa* Lista::Szukaj(int odp)
{
    return &it;
}

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