Znikanie obiektow wektora

0

Witam. Mój problem polega na tym, że mam utworzony vector w klasie Biblioteka w którym znajdują się obiekty i gdy w mainie wywołuję metodę Wypożycz z klasy Użytkownik, która korzysta potem z metody Dostępna() oraz ZmienIlosc() z klasy Biblioteka to gdy właśnie przejdzie już do tych funkcji moje obiekty vectora nie istnieją dla tej metody. Prawdopodobnie muszę zrobić wskaźnik na obiekty wektora jednakże, po wielu próbach uznałem, że nie potrafię tego zrobić. Poniżej zamieszczam kawałki kodu i proszę o jak najszybszą pomoc.

Biblioteka.h

 #pragma once
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <conio.h>
#include "Baza.h"
#include "Uzytkownik.h"

using namespace std;

class Biblioteka
{
public:
	vector < Baza > ksiazka;
	Biblioteka();
	~Biblioteka();
	void ZmienIlosc(int, int);
	void Usunksiazke();
	void Dodajksiazke();
	void Modyfikujksiazke();
	void Zaladuj();
	bool Dostepna(int nr);
	void Wypisz();
};

Biblioteka.cpp

#include "stdafx.h"
#include "Biblioteka.h"


Biblioteka::Biblioteka()
{
}

Biblioteka::~Biblioteka()
{
}

void Biblioteka::ZmienIlosc(int nr, int ile)
{
	ksiazka[nr - 1].Aktualnieile = (ksiazka[nr - 1].Aktualnieile + ile);
}

bool Biblioteka::Dostepna(int nr)
{
	if (ksiazka[nr-1].Aktualnieile >= 1)
		return true;
	else
	return false;
}

 

Uzytkownik.h

#pragma once
#include <time.h>
#include "Biblioteka.h"
#include <conio.h>
#include "Baza.h"

class Uzytkownik
{
public:
	Uzytkownik();
	~Uzytkownik();
	void Wypozycz();
	void Zwroc();
	int AktualnyCzas;
	int Ileksiazekaktualnie;
};

 

Uzytkownik.cpp

#include "stdafx.h"
#include "Uzytkownik.h"


Uzytkownik::Uzytkownik()
{
}


Uzytkownik::~Uzytkownik()
{
}


void Uzytkownik::Wypozycz()
{
	int wybor;
	Biblioteka obiekt;
	cout << "Podaj nr ksiazki ktora chcesz wypozyczyc: ";
	cin >> wybor;
	if (obiekt.Dostepna(wybor) == true)
		obiekt.ZmienIlosc(wybor, -1);
	else
		cout << "Aktualnie nie posiadamy zadnego egzemplarza tej ksiazki";
}


void Uzytkownik::Zwroc()
{
}
 

Baza.h

#pragma once
#include <string>
using namespace std;
class Baza
{
public:
	Baza(string, string, int, int);
	Baza();
	~Baza();
	string Autor;
	string Nazwa;
	int Sztuk;
	int	Aktualnieile;
};

 

Baza.cpp

 #include "stdafx.h"
#include "Baza.h"


Baza::Baza()
{
}

Baza::Baza(string n1, string n2, int n3, int n4)
{
	this->Nazwa = n1;
	this->Autor = n2;
	this->Sztuk = n3;
	this->Aktualnieile = n4;
}

Baza::~Baza()
{
}
1

A jak te książki dodajesz?

2

Ale jak to niby ma działać? o_O Przecież ja widzę ze w metodzie void Uzytkownik::Wypozycz() tworzysz NOWY OBIEKT biblioteka i próbujesz z niego coś wypozyczać. To czego się niby spodziewasz?

0

Książki dodaję za pomocą funkcji

 void Biblioteka::Dodajksiazke()
{
	string nazwa, autor;
	int sztuk;

	cout << "\nPodaj nazwe: ";
	getline(cin, nazwa);
	cout << "\nPodaj autora: ";
	getline(cin, autor);
	cout << "\nIle sztuk: ";
	cin >> sztuk;
	ksiazka.push_back(Baza(nazwa, autor, sztuk, sztuk));
	fstream plik;
	plik.open("ksiazki.txt", ios::out | ios::app);
	plik << ksiazka[ksiazka.size()-1].Nazwa << endl;
	plik << ksiazka[ksiazka.size()-1].Autor << endl;
	plik << ksiazka[ksiazka.size()-1].Sztuk << endl;
	plik << ksiazka[ksiazka.size()-1].Aktualnieile << endl;
	plik << "******************" << endl;
	plik.close();
}

lub z pliku.

No to jak mam zrobić, żeby używało tamtych obiektów?

1

Zaprojektować to z głową? o_O Użytkownik musi mieć w jakiś sposób dostęp do biblioteki żeby móc z niej skorzystać. U ciebie to są dwa zupełnie oderwane byty.

Póki co wygląda to u ciebie tak, że każesz Mietkowi wypożyczyć książkę a on mówi Ok! zakładam własną bibliotekę i próbuję pożyczyć z niej książkę! Ale nie mam ksiażek :(

0

Dlatego właśnie pytam jak mam to powiązać? Jakbym wiedział jak to zrobić to przecież bym nie pytał?

1

To chyba dość logiczne że obiekt Użytkownik musi mieć dostęp do obiektu Biblioteka. Jak ten dostęp zapewnić? Są setki sposobów, począwszy od zwykłego przekazania jako argument metody albo jako argument konstruktora, poprzez Singleton i ServiceLocator na jakimś kontenerze IoC kończąc.

1

Nie używaj using namespace w plikach .h, bo taki using wycieka do pliku .cpp, co wcale nie jest pożądane.

1

jak dla mnie biblioteka powinna miec vector użytkowników, i to jej obiekt powinien nimi zarządzać

tworzysz obiekt biblioteka umieszasz w nim książki, rejestrujesz użytkowników i pracujesz na tych danych

0

Mógłby mi ktoś wytłumaczyć mi jak mam wysłać metodę jako argument, żeby to działało bo nie do końca rozumiem.

1

Proszę:

#include <iostream>
using namespace std;

struct A
  {
   void fun1() { cout<<1<<endl; }
   void fun2() { cout<<2<<endl; }
  };
  
struct B
  {
   A &a;
   void(A::*fun)();
   B(A &a,void(A::*fun)()):a(a),fun(fun) {}
   void call() { (a.*fun)(); }
  };
  
int main()
  {
   A a;
   B b1(a,&A::fun1),b2(a,&A::fun2);
   b2.call();
   b1.call();
   return 0;
  }

Aczkolwiek nie tego potrzebujesz.

2
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>

class User
{
public:
	User(std::string const& nazwa) : nazwa_(nazwa) {}

	std::string nazwa() const { return nazwa_; }
private:
	std::string nazwa_;
};

class Book
{
public:
	Book(std::string const& dane) : dane_(dane) {}

	std::string pobierzDane() const { return dane_; }

	void wypiszDaneKsiazki() { std::cout << dane_; }

	bool operator<(Book const& inna) const { return this->dane_ < inna.dane_; }
private:
	std::string dane_;
};

class Library
{
public:
	Library() { std::cout << "Tworze nowa biltioteke." << std::endl; }

	void dodtajKsiazke(std::string const& dane)
	{
		std::cout << "Dodaje ksiazke: " << dane << std::endl;
		pozyczki_[dane] = { };
	}

	void dodajUzytkownika(std::string const& nazwa) {
		std::cout << "Tworze uzytkownika: " << nazwa << std::endl;
		uzytkownicy_.emplace_back(nazwa);
	}

	void wypozycz(std::string const& daneKsiazki, std::string const& daneUzytkownika)
	{
		auto userIt = std::find_if(std::begin(uzytkownicy_), std::end(uzytkownicy_), [&daneUzytkownika](User const& uzytkownik) -> bool {
									   return uzytkownik.nazwa() == daneUzytkownika;
								   });
		if(userIt == std::end(uzytkownicy_)) {
			std::cout << daneUzytkownika << " probuje ukrasc ksiazke! Brak danych o uzytkowniku\n";
			return;
		}

		auto ksiazkaIt = pozyczki_.find(daneKsiazki);
		if(ksiazkaIt == std::end(pozyczki_)) {
			std::cout << "nie ma takiej ksiazki.\n";
			return;
		}

		std::cout << "Uzytkownik: " << daneUzytkownika << " pozycza ksiazke: " << daneKsiazki << std::endl;
		ksiazkaIt->second.push_back(&*userIt);
	}

	void wypiszUzytkownikow()
	{
		for(auto const& u : uzytkownicy_)
			std::cout << u.nazwa() << std::endl;
	}

	void wypiszKsiazki()
	{
		for(auto const& k : pozyczki_)
			std::cout << k.first.pobierzDane() << std::endl;
	}

	void wypiszDluznikow()
	{
		for(auto const& danePozyczki : pozyczki_) {
			for(auto const& uzytkownik : danePozyczki.second) {
				std::cout << "Ksiazke: " << danePozyczki.first.pobierzDane() << " jest wypozyczona: " << uzytkownik->nazwa() << std::endl;
			}
		}
	}

private:
	std::vector<User> uzytkownicy_;

	std::map<Book, std::vector<User*> > pozyczki_;
};

int main()
{
	Library l;
	l.dodajUzytkownika("Franek Kimono");
	l.dodajUzytkownika("Jan Kowalski");
	l.dodajUzytkownika("Grzegorz Nijaki");

	l.dodtajKsiazke("Biblia");
	l.dodtajKsiazke("Lalka");
	l.dodtajKsiazke("Mistrz i Malgorzata");

	l.wypozycz("Lalka", "Jan Kowalski");
	l.wypozycz("Mistrz i Malgorzata", "Jan Kowalski");
	l.wypozycz("Biblia", "Franek Kimono");
	l.wypozycz("Biblia", "Ziobro Ziobro");
	l.wypozycz("Mistrz i Malgorzata", "Franek Kimono");

	std::cout << "Ksiazki w bibliotece: " << std::endl;
	l.wypiszKsiazki();

	std::cout << "Zarejestrowani uzytkownicy." << std::endl;
	l.wypiszUzytkownikow();

	std::cout << "Wypisz dluznikow." << std::endl;
	l.wypiszDluznikow();

	return 0;
}

wklej to sobie i zobacz mniej wiecej jak układają się zależności w programie

na bank nie jest to ideał, ale od tego bym wyszedł

nie trzeba tu przekazywać żadnych metod

0

Dzięki wielkie za pomoc wzorując się na _13th_Dragon zrobiłem to.

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