IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: C++ chyba

Aktivity
Avatar
Jan Osuský
Člen
Avatar
Jan Osuský:6.5.2018 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.5.2018 16:30
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Jan Osuský
David Hartinger:6.5.2018 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
6.5.2018 16:52
New kid back on the block with a R.I.P
Avatar
Jan Osuský
Člen
Avatar
Jan Osuský:7.5.2018 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.5.2018 18:43
Avatar
Dominik Janák:15.5.2018 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 Hartinger sorry za dislike, uklepl jsem se :-S

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

Díky moc za rady :-)

 
Nahoru Odpovědět
15.5.2018 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.