Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací
Avatar
Jan Osuský
Člen
Avatar
Jan Osuský:6. května 16:30

Ahoj, snažil jsem se vytvořit malý program na vypočty obsahu a obvodu kruhu.
Program ovšem vždy zobrazí stejné, nelogické výsledky při zadání jakékoli poloměru.
Mohl by mi někdo objasnit co se vlastně v programu děje, nějak jsem ztratil přehled :), a kde se nachází chyba?

stdafx.h

#pragma once

#include "targetver.h"
#include <iostream>
#include <stdio.h>
#include <tchar.h>

using namespace std;

class Kruh
{
public:
    void ZadejPolomer() { cin >> Polomer; }
        float ZiskejPolomer() { return Polomer; }
private:
         float Polomer;
};
class Obvod : public Kruh
{
public:
        void VypoctiObvod() { cout << ZiskejPolomer() * 2 * 3.14 << endl; }
};

class Obsah : public Kruh
{
public:
        void VypoctiObsah() { cout << ZiskejPolomer() * ZiskejPolomer() * 3.14  << endl; }
};

class Kruhjedna : public Kruh,Obvod,Obsah
{
public:
        void UkazObvod() { return VypoctiObvod(); }
        void UkazObsah() { return VypoctiObsah(); }
};

program.cpp

#include "stdafx.h"



int main()
{
        Kruh jeden;
        cout << "Zadejte polomer kruhu: ";
        jeden.ZadejPolomer();
        Kruhjedna prvni;
        cout << "\nTady je obvod: ";
        prvni.UkazObvod();
        cout << endl;
        cout << "A tady je obsah: ";
        prvni.UkazObsah();
        cin.get(); cin.get();
        return 0;
}
 
Odpovědět 6. května 16:30
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jan Osuský
David Čápka:6. května 16:52

Jak může obsah dědit z kruhu, už jsi někdy viděl obsah, který by byl zároveň kruh? Dědí třeba kruh z tvaru, protože kruh je zároveň tvar. Podle kódu jsi nepochopil základní myšlenky OOP, než budeš něco dělat, je dobrý nápad si o tom nejdříve přečíst - https://www.itnetwork.cz/cplusplus/kurz

Nahoru Odpovědět  +3 6. května 16:52
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Jan Osuský
Člen
Avatar
Jan Osuský:7. května 18:43

Děkuju moc za opravu a zároveň se ptám, zda by následující řešení bylo akceptovatelné?

stdafx.h

#pragma once

#include "targetver.h"
#include <iostream>
#include <stdio.h>
#include <tchar.h>

using namespace std;

class Tvar
{
        virtual void VypoctiObsah() {};
        virtual void VypoctiObvod() {};
};

class Kruh : public Tvar
{
public:
        void ZadejPolomer() { cin >> polomer; }
        virtual void VypoctiObsah() override { cout << polomer  * polomer * 3.14F; }
        virtual void VypoctiObvod() override { cout << polomer * 3.14F * 2;}
private:
        float polomer;
};

program.cpp

#include "stdafx.h"



int main()
{
        Kruh jeden;
        cout << "Zadejte polomer kruhu: ";
        jeden.ZadejPolomer();
        cout << "\nTady je obvod: ";
    jeden.VypoctiObvod();
        cout << endl;
        cout << "A tady je obsah: ";
        jeden.VypoctiObsah();
        cin.get(); cin.get();
        return 0;
}
 
Nahoru Odpovědět 7. května 18:43
Avatar
Dominik Janák:15. května 2:32

Todle již vypadá mnohem lépe.

Ještě ti asi nesedí návratové typy těch metod, neboť z toho nijak nedostaneš vypočtené hodnoty. (Beru zpět - valíš to rovnou na výstup -> moje chyba)

A když už si tam hraješ s těma virtuálníma metodama, zjisti si co je to abstraktní třída a zkus to zakomponovat, bylo by to pak ještě lepší. ;-)

virtual float VypoctiObsah() = 0;
virtual float VypoctiObvod() = 0;

--
David Čápka sorry za dislike, uklepl jsem se :-S

Editováno 15. května 2:34
Nahoru Odpovědět  +1 15. května 2:32
Nesnaž se převyšovat ostatní, ale sám sebe.
Avatar
Jan Osuský
Člen
Avatar
Jan Osuský:15. května 19:10

Díky moc za rady :-)

 
Nahoru Odpovědět  +1 15. května 19:10
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.