CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Polimorfizm

Polimorfizm

dział ogólny

Polimorfizm

Nowy postprzez nvdante » sobota, 23 maja 2015, 17:11

Witam serdecznie! Takie pytanko, pewnie proste... Próbuję odwołać się do polimorficznych metod poprzez wskaźnik, a w efekcie dane wyświetlane to zrzut z pamięci...
Ma ktoś pomysł co robię źle? Kompilator VS Community 2013.
Oto kod:
main.cpp
KOD cpp:     UKRYJ  
#include <iostream>
#include <Windows.h>
#include "figura.h"

using namespace std;

int main()
{
        Stozek s;
        Bryla *wsk = new Stozek;
        wsk->pobierz_dane();
        s.tworzaca();
        wsk->pole_powierzchni_calkowitej();
        wsk->objetosc();

        system("PAUSE");
        return 0;
}
 

figura.h
KOD cpp:     UKRYJ  
#include <iostream>

using namespace std;

class Bryla
{
public:
        virtual void objetosc() = 0;
        virtual void pole_powierzchni_calkowitej() = 0;
        virtual void pobierz_dane() = 0;
};

class Stozek :public Bryla
{
private:
        double r, h, l;
public:
        void objetosc();
        void pole_powierzchni_calkowitej();
        void pobierz_dane();
        void tworzaca();
};
 

figura.cpp
KOD cpp:     UKRYJ  
#include <iostream>
#include "figura.h"

using namespace std;

void Stozek::pobierz_dane()
{
        cout << "Podaj promien podstawy stozka: "; cin >> r;
        cout << "Podaj wysokosc stozka: "; cin >> h;
}

void Stozek::tworzaca()
{
        l = sqrt((h*h) + (r*r));
        cout << "Tworzaca stozka ma dlugosc: " << l << endl;
}

void Stozek::pole_powierzchni_calkowitej()
{
        cout << "Pole powierzchni calkowitej stozka to: " << (3.14*r*r) + (3.14*r*l) << endl;
}

void Stozek::objetosc()
{
        cout << "Objetosc stozka to: " << (3.14*r*r*h) / 3 << endl;
}
 
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Polimorfizm

Nowy postprzez polymorphism » sobota, 23 maja 2015, 18:31

Dla wsk nie wywołujesz tworzaca przez co l jest niezainicjalizowana. Do ustalania wartości początkowych pól klasy służy konstruktor, użyj go.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Polimorfizm

Nowy postprzez nvdante » sobota, 23 maja 2015, 21:26

A mogę jakoś wywołać wsk dla tworzaca, gdy robię wskaźnik typu Bryla, a tworzaca() jest w Stozek? Czy w ogóle powinienem? Przecież tworzaca() nie jest polimorficzna.
Zgadzam się, że jest niezainicjalizowana, ale nie rozumiem dlaczego, skoro odwołuje się do metody w klasie i nawet zapisuje w jej polach dane.
Oczywiście mogę użyć konstruktora, ale wtedy zainicjalizowana l ma wartość, np.: 0, a to nie tak ma być.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Polimorfizm

Nowy postprzez polymorphism » sobota, 23 maja 2015, 22:20

Wywołujesz tworzaca na rzecz obiektu s, a obliczenia robisz na obiekcie wskazywanym przez wsk. To są dwa różne obiekty!

Zapewne o to Ci chodzi
KOD cpp:     UKRYJ  
Stozek s;
Bryla *wsk = &s;

wsk->pobierz_dane();
s.tworzaca();
// itd.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Polimorfizm

Nowy postprzez nvdante » sobota, 23 maja 2015, 23:04

Dokładnie o to chodziło.
Czyli na początek deklaruję obiekt s typu Stozek, a później deklaruję wskaźnik typu Bryla o wartości obiektu s, tak?
Teraz ta mobilna część wskaźnika to &s i to ją muszę zmieniać dla konkretnych klas?
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Polimorfizm

Nowy postprzez polymorphism » sobota, 23 maja 2015, 23:21

(...) a później deklaruję wskaźnik typu Bryla o wartości obiektu s, tak?

Definiujesz wskaźnik wsk typu Bryla* i przypisujesz mu adres obiektu s.

Teraz ta mobilna część wskaźnika to &s (...)

Do wsk możesz przypisać adresy wszystkich obiektów klas pochodnych od Bryla - i tu się zaczyna polimorfizm.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Polimorfizm

Nowy postprzez nvdante » poniedziałek, 25 maja 2015, 20:13

OK, już kumam, dzięki wielkie za pomoc :)
Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 13 gości

cron