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

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

0 głosów
542 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,630 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,300 p.)

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

+1 głos
odpowiedź 13 lutego 2019 przez obl Maniak (51,300 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ź 448 wizyt
0 głosów
4 odpowiedzi 449 wizyt
pytanie zadane 18 lipca 2015 w C i C++ przez Rappa2 Obywatel (1,540 p.)
0 głosów
3 odpowiedzi 444 wizyt

93,599 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,082 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

Kursy INF.02 i INF.03
...