Klasy abstrakcyjne – program nie działa prawidłowo

0
#include <iostream>
#include <cmath>
class Figura{
public:

    virtual void pole()=0 ;
    virtual void obwod()=0;
    virtual void name()=0 ;
};

class Figuraa: public Figura{
public:
    double po,ob; std::string na;
};

class Kolo : public Figura{
    double PI=3.14;
    double promien;
public:
    Kolo(double promien1) {promien=promien1;}

    void pole()  {
        po= PI*promien*promien;
    }

    void obwod()  {
        ob=PI*2*promien;
    }

    void name()  {
        std::string na="Kolo";
    }

};

int main(int argc, char *argv[]) {

Figuraa figurap[10];

figura[0] =  Kolo(5);
    figura[0].obwod(); figura[0].pole(); figura[0].name();
    std::cout<<figura[0].na<<"\t\t\t"<<"Pole:"<<figura[0].pole()<<"\t\t\t"<<"Obwod:"<<figura[0].ob<<"\n";
return 0;
}

Program ma stworzyć obiekt kolo o promieniu 5, obliczyc pole, obwod i zapisać w tablicy obiektow.

Co chwile są inne błędy, nie rozumiem co robię źle.

0
Pijany Samiec napisał(a):

Co chwile są inne błędy, nie rozumiem co robię źle.

"Figuraa" jest tutaj problemem popatrz na spokojnie co jest źle

edit:
uprzedzając kolejne pytanie, jeżeli tablica ma trzymać interfejs to muszą być to wskaźniki inaczej Twoje Koło nie będzie Kołem

0
#include <iostream>
#include <cmath>
class Figura{
public:

    virtual void pole()=0 ;
    virtual void obwod()=0;
    virtual void name()=0 ;
};

class Figuraa: public Figura{
public:
    double po,ob; std::string na;
    void pole(){po=0;}
    void obwod(){ob=0;}
    void name(){na="he";}
};

class Kolo : public Figuraa{
    double PI=3.14;
    double promien;
public:
    Kolo(double promien1) {promien=promien1;}

    void pole()  {
        po= PI*promien*promien;
    }

    void obwod()  {
        ob=PI*2*promien;
    }

    void name()  {
        std::string na="Kolo";
    }

};

int main(int argc, char *argv[]) {

Figuraa figura[5];

figura[0] =  Kolo(5);
    figura[0].obwod(); figura[0].pole(); figura[0].name();
    std::cout<<figura[0].na<<"\t\t\t"<<"Pole:"<<figura[0].po<<"\t\t\t"<<"Obwod:"<<figura[0].ob<<"\n";
return 0;
}

Dlaczego wartosci na,po,ob bierze z klasy Figuraa a nie Kolo? Wspomne tylko o tym, że do tej tablicy figura chcę dodawać potem elementy z innych klas np. kwadrat, pieciokat itd.

0
#include <iostream>
#include <cmath>
class Figura{
public:
    double po,ob; std::string na;
    virtual void pole()=0 ;
    virtual void obwod()=0;
    virtual void name()=0 ;
};


class Kolo : public Figura{
    double PI=3.14;
    double promien;
public:
    Kolo(double promien1) {promien=promien1;}

    void pole()  {
        po= PI*promien*promien;
    }

    void obwod()  {
        ob=PI*2*promien;
    }

    void name()  {
        std::string na="Kolo";
    }

};

int main(int argc, char *argv[]) {

 Kolo hehe(5);
     hehe.pole();
     std::cout<<hehe.po;

 return 0;
}

Jak tworzę obiekty samemu to wszystko działa. Główny problem jest w tym jak mam stworzyć tablicę dla kilku różnych obiektów, a od klasy Figura nie mogę utworzyć tablicy. Myślałem nad tą klasa Figuraa. ale coś nie wychodzi.

0

Jeśli potrzebujesz niedynamicznej tablicy obiektów, musisz zdefiniować konstruktor domyślny klasy Kolo.
(Przynajmniej taki powinien być błąd kompilacji, który też należało wkleić, aby szybciej zlokalizować błąd).

Kolo() = default;

lub

Kolo() {}

lub zdefiniować konstruktor w klasie bazowej i wywoływać ją w domyślnych konstruktorach klas pochodnych.
Wszystko zależy od potrzeb.

virtual void pole()=0 ;
virtual void obwod()=0;
virtual void name()=0 ;

Te metody powinny zwracać obliczone wartości lub nazwy, a w klasie przechowywać tylko najważniejsze dane do wykonania obliczeń,
jak promień czy długość boku.

#define _USE_MATH_DEFINES // niektóre kompilatory wymagają, aby użyć stałej M_PI
#include <iostream>
#include <cmath> // tutaj jest zdefiniowana wartość M_PI

class Shape {
public:
   Shape() = default;
   virtual double Area() const = 0;
   virtual double Perimeter() const = 0;
   virtual ~Shape() = default;
};

class Circle : public Shape {
public:
   Circle() : Shape{} {}
   Circle(double r) : radius{ r } {}
   virtual double Area() const override { return M_PI * (radius * radius); }
   virtual double Perimeter()const  override { return 2 * M_PI * radius; }
   virtual ~Circle() = default;
private:
   double radius;
};

class Square : public Shape {
public:
   Square() : Shape{} {}
   Square(double s) : side{ s } {}
   virtual double Area() const override { return side * side; }
   virtual double Perimeter() const override { return 4 * side; }
   virtual ~Square() = default;
private:
   double side;
};

int main() {
   Circle circles[2];
   circles[0] = Circle{ 3 };
   circles[1] = Circle{ 5 };

   std::cout << circles[0].Area() << '\n';
   std::cout << circles[0].Perimeter() << '\n';

   Square sqares[2];
   sqares[0] = Square{ 3 };
   sqares[1] = Square{ 5 };

   std::cout << sqares[1].Area() << '\n';
   std::cout << sqares[1].Perimeter() << '\n';
}

https://wandbox.org/permlink/jveTds7nY6uwgy4d

0

Dzięki, ale mi zależy na tym, żeby te obiekty były w jednej tablicy. Mam różne figury, kolo, kwadrat, prostokat, pieciokat, szesciokat itd i chce je umiescic w 1 tablicy figury. np. figury[0]=Pieciokat(5) figury[i]=Kolo(4) itd.

0

Czyli potrzebujesz tablicy wskaźników klasy Shape, jak wspomniał wyżej @gośćabc.

0

A jak takie coś zrobić? Nie bardzo wiem o co chodzi.

0

Przykład do wrzuconego kodu:

int main() {
   std::vector<std::unique_ptr<Shape>> shapes;
   shapes.push_back(std::make_unique<Circle>(3));
   shapes.push_back(std::make_unique<Square>(3));
   for (auto const& shape : shapes) {
      std::cout << shape->Area() << '\n';
      std::cout << shape->Perimeter() << "\n\n";
   }
}

https://wandbox.org/permlink/gRCEUef7O7k1N77u

0

Dziękuje bardzo :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.