• 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

VPS Starter Arubacloud
–1 głos
210 wizyt
pytanie zadane 10 stycznia 2017 w C i C++ przez student33 Początkujący (250 p.)

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 2017 przez Knayder Nałogowiec (37,640 p.)
przywrócone 10 stycznia 2017 przez draghan
Czemu nie podasz kodu w plikach klas?
komentarz 10 stycznia 2017 przez operator Stary wyjadacz (10,920 p.)
To jest pole do odpowiedzi nie komentowania. Kliknij na żarówkę aby ukryć.
komentarz 10 stycznia 2017 przez Knayder Nałogowiec (37,640 p.)
To była jednoczesna prośba o ten kod.
komentarz 10 stycznia 2017 przez draghan VIP (106,230 p.)
Operator ma trochę racji, ale nie widzę zasadnego powodu do zgłaszania takiej treści.
komentarz 10 stycznia 2017 przez student33 Początkujący (250 p.)
W odpowiedzi niżej wkleiłem cały kod danych klas.
0 głosów
odpowiedź 10 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)
Czy metodę Get_PojemnoscSilnika w klasie bazowej oznaczyłeś jako wirtualną?
komentarz 10 stycznia 2017 przez student33 Początkujący (250 p.)
Tak, mam oznaczoną jako virtual unsigned int Get_PojemnoscSilnika().
komentarz 10 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)

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 2017 przez student33 Początkujący (250 p.)
#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 2017 przez Evelek Nałogowiec (28,960 p.)
W klasie samochod.h nie ma nawet takiej metody "Get_PojemnoscSilnika()".
komentarz 10 stycznia 2017 przez student33 Początkujący (250 p.)
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 2017 przez student33 Początkujący (250 p.)

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

+2 głosów
3 odpowiedzi 8,696 wizyt
0 głosów
1 odpowiedź 312 wizyt
pytanie zadane 11 kwietnia 2016 w C i C++ przez aspoka Mądrala (5,290 p.)
0 głosów
5 odpowiedzi 709 wizyt
pytanie zadane 24 czerwca 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...