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

Gdzie jest błąd (c++)?

Object Storage Arubacloud
0 głosów
350 wizyt
pytanie zadane 12 lutego 2019 w C i C++ przez Fan Początkujący (250 p.)

Gdzie jest błąd?

#include <iostream>

using namespace std;

class Ksztalt
{
    virtual void oblicz_pole()=0;
    //czysta funkcja wirtalna

};
class Kolo :public Ksztalt
{
    float r;
public:

    Kolo(float x)
    {
        r = x;
    }
virtual void oblicz_pole()
{
    cout<<"Pole kola :"<<3.14*r*r<<endl;
}

};
////////////////////////////////////
class Kwadrat :public Ksztalt
{
    float a;
    public:
    Kwadrat(float x)
    {
        a = x;
    }
    virtual void oblicz_pole()
    {
        cout<<"Pole kwadratu:"<<a*a<<endl;
    }
};
int main()
{
    Kolo k1(1);
    Kwadrat kw(2);

    Ksztalt *wsk;
    wsk = &k;
    wsk -> oblicz_pole();

    wsk = &kw;
    wsk -> oblicz_pole();
    return 0;
}

 

3 odpowiedzi

+1 głos
odpowiedź 12 lutego 2019 przez Michał Gibas Pasjonat (19,610 p.)
Może powiesz nam co to za błąd? Za mało informacji. Kompilator czy linker coś wyrzuca? Czy może program nie działa tak jak oczekiwałeś? Sprecyzuj pytanie... to nie jest tak że wklejasz kod i po prostu mówisz: "znajdźcie błąd", co to jakaś łamigłówka czy co ? ;)
1
komentarz 13 lutego 2019 przez obl Maniak (51,280 p.)

Na pewno mu wyrzuca, że zmienna k nie istnieje :)

+1 głos
odpowiedź 13 lutego 2019 przez obl Maniak (51,280 p.)
    wsk = &k;

A gdzie utworzyłeś zmienną k? Utworzyłeś zmienną k1 typu Koło i zmienną kw typu Kwadrat.

0 głosów
odpowiedź 12 lutego 2019 przez marakuja Użytkownik (590 p.)
edycja 13 lutego 2019 przez marakuja

Cześć, nie możesz dać czegoś takiego w tym przypadku:
 

Ksztalt *wsk = ....

Wynika to z tego, ze klasa Ksztalt ma tylko metodę wirtualną i nic więcej, a co za tym idzie jest klasa abstrakcyjną. Nie można tworzyć obiektów klasy abstrakcyjej.

Tutaj jest działający poprawiony kod:)
 

#include <iostream>
 
using namespace std;
 
class Ksztalt
{
    virtual void oblicz_pole()=0;
    //czysta funkcja wirtalna
 
};

class Kolo :public Ksztalt
{
    float r;
public:
 
    Kolo(float x)
    {
        r = x;
    }
virtual void oblicz_pole()
{
    cout<<"Pole kola :"<<3.14*r*r<<endl;
}
 
};
////////////////////////////////////
class Kwadrat :public Ksztalt
{
    float a;
    public:
    Kwadrat(float x)
    {
        a = x;
    }
    virtual void oblicz_pole()
    {
        cout<<"Pole kwadratu:"<<a*a<<endl;
    }
};
int main()
{
    Kolo k1(1);
    Kwadrat kw(2);
    Kolo *wsk;
    wsk = &k1;


    wsk -> oblicz_pole();
    Kwadrat *wsk1;
    wsk1 = &kw;
    wsk1 -> oblicz_pole();
    return 0;
}

 

Pozdrawiam:)

 

@EDIT
W komentarzu poprawne roziazanie problemu:)

komentarz 13 lutego 2019 przez damianeqe Gaduła (4,380 p.)
Ten zapis Ksztalt *wsk; jest poprawny, ponieważ nie tworzysz obiektu klasy abstrakcyjnej, tworzysz wskaźnik na typ Kształt.
komentarz 13 lutego 2019 przez marakuja Użytkownik (590 p.)
Tak, zgadza sie, mój bład:)

Oprócz tego, że zapomniales dac "k1" zamiast "k" to jest błąd w klasie Ksztalt.
Funkcja virtualna nie jest dziedziczona bo jest prywatna. Rozwiązaniem problemu będzie dodanie słowa kluczowego "Public:" na początku klasy Ksztalt:)

Podobne pytania

0 głosów
1 odpowiedź 279 wizyt
0 głosów
4 odpowiedzi 294 wizyt
pytanie zadane 18 lipca 2015 w C i C++ przez Rappa2 Obywatel (1,540 p.)
0 głosów
3 odpowiedzi 262 wizyt

92,554 zapytań

141,400 odpowiedzi

319,537 komentarzy

61,938 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...