Tworzenie obiektu na podstawie wyboru użytkownika

0

Witam, uczę się programować na podstawie "Od zera...", doszedłem do końca działu 1., rzuciłem okiem na dział drugi, ale przecież tylko czytając się nic nie nauczę :)

Żeby ogarnąć klasy i obiekty, a przynajmniej ich podstawy, po kilku prostych programach postanowiłem zrobić troszkę większy (jak na ten poziom nauki) program, "gra wyścigi", wsio w konsoli oczywiście, więc są to dość symboliczne wyścigi :)

Mam klasę bazową "samochód" oraz klasy pochodne, jako konkretne modele aut z konkretnymi danymi.
Gracz ma na początku wybrać jaki chce model samochodu i na podstawie tego wyboru program powinien stworzyć odpowiedni obiekt odpowiedniej klasy. Potem, po wyborze ilosci przeciwników gra wylosuje modele dla każdego z nich, ale na razie stanąłem na tworzeniu obiektu dla gracza.

#include <iostream>
#include "funkcje.h"
#include "pojazdy.h"
#define O std::cout
#define I std::cin.clear();std::cin.sync();std::cin
#define E std::endl
int main(void)
{
    O<<"Podaj nazwe gracza: ";
    gracz Player_1;
    I>>Player_1.nazwa_gracza;
    O<<"\nWitaj "<<Player_1.nazwa_gracza<<"!"<<E;
    O<<"\nWybierz samochod.\n";
    // Wypisanie mozliwych do wyboru aut.
    I>>Player_1.numer_samochodu;
    while (Player_1.numer_samochodu<1 || Player_1.numer_samochodu>12 || std::cin.good()==0 || std::cin.fail()==1)
    {
        O<<"Nie ma takiej opcji!\n";
        O<<"Wybierz samochod."<<E;
        I>>Player_1.numer_samochodu;
    }
    samochod* Player_1_auto = Stworz_auto_gracza(Player_1.numer_samochodu);

    return 0;
}

fragment dolaczonego pliku:

samochod* Stworz_auto_gracza(int wybor_auta)
{
    switch (wybor_auta)
    {
        case 1: return (new Audi_TT);
        case 2: return (new Porsche_911);
        case 3: return (new Mazda_MX5);
        case 4: return (new Polonez);
        case 5: return (new Fiat_126);
        case 6: return (new Garbus);
        case 7: return (new Tico);
        case 8: return (new Porsche_Cayenne);
        case 9: return (new Audi_DD);
        case 10: return (new Traktor);
        case 11: return (new Statek_Kosmiczny);
        case 12: return (new Samojazd);
        default: return NULL;
    }
}

Nie bijcie za te makra na początku, chyba, że za endl, muszę jeszcze ogarnąć kiedy się go używa, ale nie o tym temat.

Gdybym od razu w switchu tworzył obiekty bez użycia [i][color=blue]new[/color][/i], to poza switchem program ich nie widzi, co raczej zrozumiałe, więc znalazłem gdzieś informację żeby użyć takiej metody.

Po 22 linijce w [i]main[/i] rzutowalbym dynamic_cast'em na odpowiedni typ. Problem w tym, że w zaleznosci od modelu trzeba rzutowac na inny typ.

Jak więc powinienem, na podstawie wyboru gracza (lub drogą losowania) stworzyć odpowiedni obiekt odpowiedniej klasy, żebym mógł go używać? Albo co robię źle?

C::B wyrzuca mi takie błędy (dotyczą one tego fragmentu dołączonego pliku):

D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp||In function 'samochod* Stworz_auto_gracza(int)':|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|19|error: 'samochod' is an inaccessible base of 'Audi_TT'|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|20|error: 'samochod' is an inaccessible base of 'Porsche_911'|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|21|error: 'samochod' is an inaccessible base of 'Mazda_MX5'|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|22|error: 'samochod' is an inaccessible base of 'Polonez'|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|23|error: 'samochod' is an inaccessible base of 'Fiat_126'|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|24|error: 'samochod' is an inaccessible base of 'Garbus'|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|25|error: 'samochod' is an inaccessible base of 'Tico'|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|26|error: 'samochod' is an inaccessible base of 'Porsche_Cayenne'|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|27|error: 'samochod' is an inaccessible base of 'Audi_DD'|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|28|error: 'samochod' is an inaccessible base of 'Traktor'|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|29|error: 'samochod' is an inaccessible base of 'Statek_Kosmiczny'|
D:\Studia\C++\Projekty\Super Wyscigi\pojazdy.cpp|30|error: 'samochod' is an inaccessible base of 'Samojazd'|
||=== Build finished: 12 errors, 0 warnings ===|

Po wywaleniu z maina 22. linijki (zaczynającej sie od samochod*), a z dołączonego pliku funkcji samochod* Stworz_auto_gracza(int wybor_auta) (oraz jej deklaracji z odpowiedniego nagłówka) wsio działa jak powinno, no ale nie mam tworzenia auta gracza.

W załączniku wrzucam cały projekt. Proszę o pomoc w znalezieniu rozwiązania.

0

Ale przecież masz jak byk napisane jaki jest problem. Chcesz tworzyć obiekty klas pochodnych ale nie da się ich stworzyć bo odpowiedni konstruktor klasy bazowej samochód nie jest dostępny.

0

To jak powinien wygladac ten konkretny konstruktor? Dodaje zwykly i to samo.
A poza tym wiekszym problemem jest jak potem, na bazie wyboru usera, rzutować na odpowiedni typ? Przeciez typ zalezy od wyboru usera, wiec nie moge jednego dać.To jest w zasadzie głównym problemem.

Edit:
Błędy były spowodowane brakiem "public " w Audi_TT : samochod, teraz działa, tylko wciaz nie wiem jak rzutowac dynamic castem na dany typ, w zasadzie to jak ustawic zeby ustawial dobry typ.

0

Ale po co? Rzutowanie w górę to zbrodnia! Używaj polimorfizmu! Po co ci wiedzieć czy samochód jest tym czy innym?

0

Polimorfizm powiadasz, w takim razie biorę się za lekturę i będę próbował coś spłodzić. Dzięki za ukierunkowanie, w którą stronę iść, aby rozwiązać problem :)

0

Od razu możesz zainteresować się fabrykami, szczególnie takimi w wydaniu Andrei Alexandrescu.

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