Kontenery projekt na zajecia

0

Witam, piszę program na zajęcia, w którym jest dealr samochodowy i tam można kupić auto. Mam metody od dodawania samochodu, dodawania klienta itd. Jestem na wczesnym etapie, jednak już pojawił się problem, z którym nie mogę sobie poradzić. Otóż dodaję samochód, potem wrzucam wskaźnik do kontenera, dodaję klienta i wrzucam go do kontenera z klientami i tak kilka razy. Problemem jest dla mnie w jaki sposób pokazać, że np klient x kupił samochód y. Jak samochód zostanie kupiony to muszę wyrzucić go z kontenera samochodów, a potem... no właśnie nie wiem co potem. Czy wrzucić go do kolejnego kontenera? Ale wtedy bym musiał tworzyć dla każdego klienta kontener. Nie jest specjalistą ale wydaje mi się to mało optymalne. Może ktoś ma jakiś pomysł co z tym fantem mogę zrobić?

0

Niech każdy klient ma pod sobą kontener z wypożyczonymi samochodami.
Lub każdy samochód ma wskaźnik na klienta który go wypożyczył lub NULL jeżeli jest wolny.

0

Aha, czyli mogę np. dodać w konstruktorze klienta coś takiego:

std::vector <Vehicle*> bought_cars; 
Vehicle * bought_car;

Czy dobrze zrozumiałem? W ten sposób będę mógł się odwoływać jak do zmiennej przez wskaźnik?

0

Czy odróżniasz konstruktor od klasy?

0

Tak. Konstruktor służy do tworzenia obiektów klasy, która jest zbiorem metod i danych. Czyli zrozumiałem, że źle pomyślałem... Jednak jak w atkim razie mogę utworzyć kontener dla obiektu?

0

Tak jak opisałem tu: http://4programmers.net/Forum/1097937
Zwyczajnie powiedz którego słowa nie zrozumiałeś.

0

Rozumiem, co masz na myśli, jednak nie wiem w jaki sposób każdy klient ma mieć kontener. Muszę dla każdego klienta tworzyć osobny kontener?

0

No tak jak to napisałeś wcześniej będzie okej

std::vector <Vehicle*> bought_cars;  

to w klasie klienta zrobisz, a nie w konstruktorze tak jak napisałeś

0

Dzięki!

0

Tak a propos, druga wersja jest prostsza w realizacji.

0

Tylko, że ja chcę aby samochód był przenoszony z kontenera od sprzedawcy do kontenera klienta. Tym sposobem mogę w razie czego wyświetlić listę samochodów jakie kupił dany klient... Jest może jakiś prosty sposób żeby przenieść element z jednego wektora do drugiego? Poruszać się potrafię po wektorze jednak nie wiem jak przenieść interesujący mnie element

0

Może użyj innego kontenera - list<>

0

Przeglądam na jego temat i też nie mogę znaleźć jak przenieść element do drugiego kontenera. Czy takie coś by było poprawne?

 bought_cars.puch_back(cars[i])

A potem ręczne usunięcie z wektora cars?

0

znalazłem coś takiego:

 void splice ( iterator position, list<T,Allocator>& x );

Tylko nie do końca wiem w jaki sposób przerobić to aby przenosiło jeden element....

0

Wersja 2 ci pasuje: http://www.cplusplus.com/reference/list/list/splice/
Przykład na dole.

0

Dzięki... Jednak teraz mam problem z wyświetleniem zawartości listy (wcześniej vector wyświetlało mi ładnie), może pokaże kod:

 std::ostream &operator << (std::ostream &os, Vehicle &u) {
    return os << u.to_string();
}

void Bureau::show_cars()
{
    for (size_t i = 0; i < cars.size(); i++)
        {
            std::cout << *(cars[i]) << std::endl;
        }
}

a tu metoda to_string z innej klasy :

std::string Vehicle::to_string()
{
    std::stringstream ss;
    std::string strings;
    ss << id_car << " " << marque << " " << model << " " << year << " " << price;
    strings = ss.str();
    return strings;
} 
1
void showCars(){
    for(const auto car : cars)
        cout << *car << endl;
}
0
for(list<Vehicle*>::iterator i=cars.begin();i!=cars.end();++i) std::cout<<*i<<std::endl;
0

@spartanPAGE działa mimo, że nie rozumiem :p (dodałem jedynie * przed car). Wyświetla mi teraz ładnie jednak nr id auta źle podaje, np jak dodam dwa auta to po dodaniu pierwszego dostaję komunikat że przypisano nr id 1, potem dodam drugie i przypisuje mi 2, ale jak wyświetla to oba mają 3 :/ oto kod klasy Vehicle
Vehicle.h

 #ifndef VEHICLE_H
#define VEHICLE_H

#include <string>

class Vehicle
{
private:
    static int id_car;
    int year;
    std::string marque;
    std::string model;
    double price;
public:
    Vehicle();
    Vehicle(std::string, std::string, int, double);
    ~Vehicle();
    std::string to_string();
    friend class Bureau;
};

#endif // VEHICLE_H

Vehicle.cpp

 #include "Vehicle.h"
#include <iostream>
#include <sstream>

int Vehicle::id_car = 1;

Vehicle::Vehicle()
{
}

Vehicle::Vehicle(std::string marque, std::string model, int year, double price)
{
    this->id_car=id_car;
    this->marque=marque;
    this->model=model;
    this->year=year;
    this->price=price;
    std::cout << "Utworzono pojazd i przypisano mu nr id: " << id_car << std::endl;
    id_car++;
}

Vehicle::~Vehicle()
{
}

std::string Vehicle::to_string()
{
    std::stringstream ss;
    std::string strings;
    ss << id_car << " " << marque << " " << model << " " << year << " " << price;
    strings = ss.str();
    return strings;
}

Tak tworzę samochód

void Bureau::add_car()
{
    std::string c_marque, c_model;
    int c_year;
    double c_price;
    std::cout << "Podaj marke: ";
    std::cin >> c_marque;
    std::cout << "Podaj model: ";
    std::cin >> c_model;
    std::cout << "Podaj rok produkcji: ";
    std::cin >> c_year;
    std::cout << "Podaj cene: ";
    std::cin >> c_price;
    car = new Vehicle(c_marque, c_model, c_year, c_price);
    cars.push_back(car);
} 

Ogólnie wiem dlaczego tak się dzieje: wina konstruktora, gdyż nie ma w konstruktorze argumentu id_car...

0
class Vehicle
  {
   private:
   static int id_car_seed;
   int id_car;
   public:
   Vehicle(std::string, std::string, int, double):id_car(++id_car_seed) { ... }
  };
int Vehicle::id_carr_seed=0;
0

Dzięki działa ładnie

0

Wracam z problem odnośnie przenoszenie między listami

 customers[customer_id-1]->bought_cars.splice(bought_cars.end(), cars[car_id-1]);

tak wiem jest to źle, ale przy w vectorze w ten sposób można było pracować... A tu kompletnie nie mogę nic zrobić... Możecie mnie naprowadzić na dobrą drogę?

0

Interesuje cię ta wersja: void splice (iterator position, list& x, iterator i);
Tak a propos, może zastąp vector<Customer*> na map<int,Customer*>

0

Wyrzuciłem z całeho projektu vectory i dałem zamiast nich list... Źle zrobiłem?
Nie mogę poradzić sobie z ustawieniem iteratora:

 std::list<Vehicle*>::iterator it;
it = cars.begin();

ale jak chcę np na pozycję begin()+x to wywala błędami

0

iteratory dla listy wyłacznie sekwencyjne.

0

google nie powiedziała mi zbyt wiele na temat iteratorów sekwencyjnych... albo ja nie zrozumiałem... próbowałem czegoś takiego ale też źle:

for (size_t i=0; i<cars.size(); i++)
    {
        if (cars[i]->car->id_car == car_id)
        {

        }
    } 
0

Kolego, najpierw musisz użyć gwiazdki, czyli zdereferować iterator , bo to tylko wskaźnik, tyle że lepszy.
A jeśli nie rozumiesz czym jest iterator sekwencyjny, to jest to coś takiego co może odnośić się jedynie do swojego poprzedniego, oraz następnego elementu.
Iterator o dostępie swobodnym z miejsca 0 mógłby odnieść sie do miejsca 42, kumasz?

0

@_borisov8 dzięki za wytłumaczenie.
@_13th_Dragon twoje rozwiązanie nie działa mi poprawnie... podczas np wyświetlania pokazuje mi chyba adresy?
Chyba zrozumiałem co chcecie mi przekazać...

0

@_borisov8 dzięki za wytłumaczenie.
@_13th_Dragon twoje rozwiązanie nie działa mi poprawnie... podczas np wyświetlania pokazuje mi chyba adresy?
Chyba zrozumiałem co chcecie mi przekazać...

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