• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Programowanie obiektowe, wskaźniki, dynamiczne alokowanie pamięci

–1 głos
87 wizyt
pytanie zadane 10 stycznia w C i C++ przez użytkownika student33 Nowicjusz (140 punkty)

Witam!

Piszę od niedawna projekt i natrafiłem na problem, nad którym siedzę i póki co nie mogę znaleźć rozwiązania, wytłumaczenia. Mianowicie posiadam w swoim projekcie 3 klasy, jedną z nich jest klasa Pojazd, następnie dziedzicząca z niej klasa Samochód, a nad nimi znajduje się "interfejs", z którego chcę tworzyć nowe pojazdy.

private:
    Pojazd* m_pojazd=NULL;
    vector<Pojazd *> pojazdy;

tak wygląda zawartość interfejs.h, w którym tworzę wskaźnik na obiekt typu Pojazd. W pliku cpp tworzę obiekt klasy Samochód. 

    cout<<"Podaj cene samochodu"<<endl;
    cin>>Cena;
    cout<<"Podaj pojemnosc"<<endl;
    cin>>pojemnosc;
    cout<<"Podaj segment"<<endl;
    cin>>segment;
    m_pojazd = new Samochod(Cena,pojemnosc,segment);
    cout<<m_pojazd->Get_PojemnoscSilnika()<<endl;
    pojazdy.push_back(m_pojazd);

W tym miejscu znajduje się mój problem, a mianowicie w momencie kiedy wywołuje się funkcja Get_PojemnoscSilnika(), wywołuje się ona z klasy Pojazd, a nie z klasy Samochód i prowadzi to do tego, że wynik który pokazuje mi się na konsoli jest kompletnie z kosmosu. 

Tak więc chciałbym się dowiedzieć w jaki sposób wywołać metodę z klasy Samochód, oraz przy okazji upewnić, czy dobrze umieszczane są obiekty w wektorze.

2 odpowiedzi

+1 głos
odpowiedź 10 stycznia przez użytkownika Knayder Mądrala (6,490 punkty)
przywrócone 10 stycznia przez użytkownika draghan
Czemu nie podasz kodu w plikach klas?
komentarz 10 stycznia przez użytkownika operator Stary wyjadacz (10,660 punkty)
To jest pole do odpowiedzi nie komentowania. Kliknij na żarówkę aby ukryć.
komentarz 10 stycznia przez użytkownika Knayder Mądrala (6,490 punkty)
To była jednoczesna prośba o ten kod.
komentarz 10 stycznia przez użytkownika draghan Szeryf (78,420 punkty)
Operator ma trochę racji, ale nie widzę zasadnego powodu do zgłaszania takiej treści.
komentarz 10 stycznia przez użytkownika student33 Nowicjusz (140 punkty)
W odpowiedzi niżej wkleiłem cały kod danych klas.
0 głosów
odpowiedź 10 stycznia przez użytkownika Evelek Stary wyjadacz (11,970 punkty)
Czy metodę Get_PojemnoscSilnika w klasie bazowej oznaczyłeś jako wirtualną?
komentarz 10 stycznia przez użytkownika student33 Nowicjusz (140 punkty)
Tak, mam oznaczoną jako virtual unsigned int Get_PojemnoscSilnika().
komentarz 10 stycznia przez użytkownika Evelek Stary wyjadacz (11,970 punkty)

W takim razie wrzuć cały kod klasy bazowej i pochodnej, bo przyczyn może być wiele. Zły konstruktor, Pojazd* m_pojazd=NULL; przerzucić do interfejs.cpp itd.

komentarz 10 stycznia przez użytkownika student33 Nowicjusz (140 punkty)
#include <iostream>
#include <string>
#include "Samochod.h"

using namespace std;

Samochod::Samochod(double CenaBazowa,double PojemnoscSilnika,string segment): Pojazd_silnikowy(CenaBazowa,PojemnoscSilnika)
{

}

Samochod::~Samochod()
{

}

string Samochod::Get_Typ()
{
    return "samochod";
}

string Samochod::Get_Segment()
{
    return segment;
}

void Samochod::Set_Segment(string typ)
{
    segment=typ;
}
#ifndef SAMOCHOD_H
#define SAMOCHOD_H
#include <iostream>
#include <string>
#include "Pojazd_silnikowy.h"

using namespace std;

class Samochod: public Pojazd_silnikowy
{
public:
    Samochod(double CenaBazowa,double PojemnoscSilnika, string segment);
    virtual ~Samochod();

    string Get_Typ();
    virtual double Get_CenaWypozyczenia();
    string Get_Segment();
    void Set_Segment(string typ);

private:
    string segment;
};

#endif /* SAMOCHOD_H */
#ifndef POJAZD_SILNIKOWY_H
#define POJAZD_SILNIKOWY_H
#include <iostream>
#include <string>
#include "Pojazd.h"

using namespace std;

class Pojazd_silnikowy: public Pojazd
{
public:
    Pojazd_silnikowy(double CenaBazowa,double PojemnoscSilnika);
    virtual ~Pojazd_silnikowy();

    virtual unsigned int Get_PojemnoscSilnika();
    void Set_PojemnoscSilnika(unsigned int PojemnoscS);
    virtual double Get_CenaWypozyczenia();

protected:
    unsigned int PojemnoscSilnika;
};

#endif /* POJAZD_SILNIKOWY_H */

#include <iostream>
#include <string>
#include "Pojazd_silnikowy.h"

using namespace std;

Pojazd_silnikowy::Pojazd_silnikowy(double CenaBazowa,double PojemnoscSilnika): Pojazd(CenaBazowa)
{

}

Pojazd_silnikowy::~Pojazd_silnikowy()
{

}

unsigned int Pojazd_silnikowy::Get_PojemnoscSilnika()
{
    return PojemnoscSilnika;
}

void Pojazd_silnikowy::Set_PojemnoscSilnika(unsigned int PojemnoscS)
{
    PojemnoscSilnika=PojemnoscS;
}

double Pojazd_silnikowy::Get_CenaWypozyczenia()
{
}
#include <iostream>
#include <string>
#include "pojazd.h"

using namespace std;

int idpojazdu=1;
Pojazd::Pojazd(double CenaBazowa)
{
    this->CenaBazowa=CenaBazowa;
    IDpojazdu=idpojazdu;
    idpojazdu++;
}

Pojazd::~Pojazd()
{
}

double Pojazd::Get_CenaWypozyczenia()
{

}

string Pojazd::Get_Typ()
{
    return typ_pojazdu;
}

bool Pojazd::getDostepnosc() {
	return dostepny;
}

bool Pojazd::setDostepnosc(bool dostepny)
{
    this->dostepny=dostepny;
}

string Pojazd::Get_Segment()
{

}

unsigned int Pojazd::Get_PojemnoscSilnika()
{

}
#ifndef POJAZD_H
#define POJAZD_H
#include <iostream>
#include <string>


using namespace std;

class Wypozyczenie;

class Pojazd
{
public:
    Pojazd(double CenaBazowa);
    virtual ~Pojazd();

    double CenaBazowa;
    double IDpojazdu;

    bool dostepny = false;
    virtual double Get_CenaWypozyczenia();
    string Get_Typ();
    virtual unsigned int Get_PojemnoscSilnika();
    virtual string Get_Segment();
    void Wypozycz(Wypozyczenie* wypozyczenie);
    bool getDostepnosc();
    bool setDostepnosc(bool dostepny);

protected:
    string typ_pojazdu;

};

#endif /* POJAZD_H */

i do tego "interfejs", z którego tworzę nowe obiekty:

#include <iostream>
#include <string>
#include "ManagerPojazdow.h"

using namespace std;

double Cena,pojemnosc;
string segment;

void ManagerPojazdow::DodajSamochod()
{
    cout<<"Podaj cene samochodu"<<endl;
    cin>>Cena;
    cout<<"Podaj pojemnosc"<<endl;
    cin>>pojemnosc;
    cout<<"Podaj segment"<<endl;
    cin>>segment;
    m_pojazd = new Samochod(Cena,pojemnosc,segment);
    cout<<m_pojazd->Get_PojemnoscSilnika()<<endl;
    pojazdy.push_back(m_pojazd);
}

void ManagerPojazdow::DodajRower()
{
    cout<<"Podaj cene roweru"<<endl;
    cin>>Cena;
    m_pojazd = new Rower(Cena);
    pojazdy.push_back(m_pojazd);
}

void ManagerPojazdow::DodajMotorower()
{
    cout<<"Podaj cene motoroweru"<<endl;
    cin>>Cena;
    cout<<"Podaj pojemnosc"<<endl;
    cin>>pojemnosc;
    m_pojazd = new Motorower(Cena,pojemnosc);
    pojazdy.push_back(m_pojazd);
}
#ifndef MANAGERPOJAZDOW_H
#define MANAGERPOJAZDOW_H
#include <iostream>
#include <string>
#include <vector>
#include "Pojazd.h"
#include "Pojazd_silnikowy.h"
#include "Rower.h"
#include "Samochod.h"
#include "Motorower.h"

using namespace std;

class ManagerPojazdow
{
public:
    void DodajSamochod();
    void DodajRower();
    void DodajMotorower();
    void IloscPojazdowWBazie();
    void WypiszPojazdy();

private:
    Pojazd* m_pojazd=NULL;
    vector<Pojazd *> pojazdy;

};

#endif /* MANAGERPOJAZDOW_H */

 

komentarz 10 stycznia przez użytkownika Evelek Stary wyjadacz (11,970 punkty)
W klasie samochod.h nie ma nawet takiej metody "Get_PojemnoscSilnika()".
komentarz 10 stycznia przez użytkownika student33 Nowicjusz (140 punkty)
Dodałem tą metodę do samochod.h jak i do samochod.cpp i nadal zwraca mi niestety nie taki wynik jak powinien.
komentarz 10 stycznia przez użytkownika student33 Nowicjusz (140 punkty)

Witam ponownie. Wydaje mi się że doszedłem już do rozwiązania tego problemu. Jak się okazało bardzo głupiego problemu. W konstruktorach nie umieściłem odpowiednio w samochodzie 

this->segment=segment;

oraz w w pojezdzie_silnikowym

this->PojemnoscSilnika=PojemnoscSilnika;

w wyniku czego przypisywały mi się do tych zmiennych randomowe wartości.

Podobne pytania

0 głosów
1 odpowiedź 569 wizyt
pytanie zadane 9 kwietnia 2016 w Nasze poradniki przez użytkownika Mirosław Zelent Pasjonat (24,830 punkty)
0 głosów
1 odpowiedź 80 wizyt
pytanie zadane 11 kwietnia 2016 w C i C++ przez użytkownika aspoka Gaduła (4,970 punkty)
0 głosów
2 odpowiedzi 68 wizyt
pytanie zadane 10 stycznia w C i C++ przez użytkownika czujek22 Bywalec (2,590 punkty)
...