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

Tablice, polimorfizm, metody

Object Storage Arubacloud
0 głosów
408 wizyt
pytanie zadane 23 lutego 2016 w C i C++ przez Ziuziek Mądrala (5,140 p.)
Witam w ponizszym kodzie chce do niego wypelnic zadanie i nie wiem jak stworzyc tablice o co chodzi, bo tablice nie mozna zrobic z roznych obiektow innych klas co nie?

http://wklej.org/id/1993787/

polecenie:

Przedstaw działanie polimorfizmu na podstawie obiektów powyższych klas(Figura, Prostokat, Kolo) zapisanych w tablicy (3elementowej) i metody obwod.

2 odpowiedzi

0 głosów
odpowiedź 23 lutego 2016 przez Radfler VIP (101,030 p.)
wybrane 23 lutego 2016 przez Ziuziek
 
Najlepsza

Możesz zawsze utworzyć tablicę wskaźników na obiekty typu Figura.

Figura *figurki[3];

figurki[0] = &figura;
figurki[1] = &prostokat;
figurki[2] = &trojkat;

for(Figura& figura : figurki) {
  cout << figurki->obwod() << '\n';
}

Wskaźnik taki może wskazywać na obiekty typów pochodnych od Figura.

komentarz 23 lutego 2016 przez Ziuziek Mądrala (5,140 p.)
Rozumiem o co chodzi tylko problem mam do bledow:

||=== Build: Debug in kolokwium 2 konstruktor (compiler: GNU GCC Compiler) ===|
D:\kolokwium 2 konstruktor\main.cpp||In function 'int main()':|
D:\kolokwium 2 konstruktor\main.cpp|112|error: expected primary-expression before ';' token|
D:\kolokwium 2 konstruktor\main.cpp|113|error: expected primary-expression before ';' token|
D:\kolokwium 2 konstruktor\main.cpp|114|error: expected primary-expression before ';' token|
D:\kolokwium 2 konstruktor\main.cpp|116|error: range-based 'for' loops are not allowed in C++98 mode|
D:\kolokwium 2 konstruktor\main.cpp|117|error: request for member 'obwod' in '*(Figura**)(& figurki)', which is of pointer type 'Figura*' (maybe you meant to use '->' ?)|
D:\kolokwium 2 konstruktor\main.cpp|116|warning: unused variable 'figura' [-Wunused-variable]|
D:\kolokwium 2 konstruktor\main.cpp|121|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
D:\kolokwium 2 konstruktor\main.cpp|123|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
||=== Build failed: 5 error(s), 3 warning(s) (0 minute(s), 0 second(s)) ===|
komentarz 23 lutego 2016 przez Radfler VIP (101,030 p.)

Może pokaż kod, tak od linijki 110 do 130. Widzę, że nie Twój kompilator nie wspiera C++11. Włącz to wsparcie w opcjach kompilacji albo zmień tę pętlę, którą Ci podałem na zwykłego fora.

komentarz 23 lutego 2016 przez Ziuziek Mądrala (5,140 p.)
int main()
{
    Figura *figurki[3];

figurki[0] = &Figura;
figurki[1] = &Prostokat;
figurki[2] = &Kolo;

for(int i=0; i<3; i++) {
  cout << figurki->obwod() << '\n';
}


    Kolo k1(3, "nazwa");
    k1.wypisz();
    Prostokat p1("prosto", 5, 6);
    p1.wypisz();
    p1.obwod();
    cout << endl;
    cout << p1;
    return 0;
}

Musze byc na normalnej wersji

 

komentarz 23 lutego 2016 przez Radfler VIP (101,030 p.)
No "normalna" wersja to aktualnie C++14 :P

A tak w ogóle to zobacz co robisz. Starasz się pobrać adresy klas (linijki 5-7)? Utwórz obiekty, a ich adresy wpisz do tablicy.
komentarz 23 lutego 2016 przez Ziuziek Mądrala (5,140 p.)
Ja narazie mam polroczne doswiadczenie w programowaniu w c++, slabo z teoria i praktyka u mnie :D

Ok to chodzi ci o to zeby z kazdej klasy stworzyc obiekt i przypisac go do tablicy figurki tylko jedno niedokminienie, jesli Figura jest klasa abstrakcyjna i nie moge utworzyc obiektu to jak? Bo tu stoje :D
komentarz 23 lutego 2016 przez Radfler VIP (101,030 p.)

Aaa, figura to klasa abstrakcyjna. Z polecenia wynikało, że klasa Figura jest zwyczajną klasą (skoro tablica jest 3elementowa to muszą być 3 klasy nieabstrakcyjne). Jak nie możesz stworzyć obiektu klasy Figura, to go nie twórz, trudno.

#PS W linijce 10 powinieneś użyć konstrukcji tablica[i].funkcja().

0 głosów
odpowiedź 23 lutego 2016 przez Ziuziek Mądrala (5,140 p.)

#include <iostream>
#include <cstring>
using namespace std;

class Figura{
 char * nazwa;
      public:
             Figura(char *n){
                 nazwa=new char[strlen(n)+1];
                 strcpy(nazwa, n);
             }
             void wypisz(){
                cout<<"Figura = "<<nazwa<<endl;
            }
             virtual void obwod()=0; //stworzenie funkcji wirtualnej

		int _obwod;
};
class Prostokat : public Figura
{
    int a,b;
public:
    Prostokat(char *n, int _a, int _b)
        :Figura(n){
			a = _a;
			b = _b;
		}

    void obwod();    //obliczanie obwodu bez zwracania
    friend ostream& operator<< (ostream& out, Prostokat& punkt);
};
void Prostokat::obwod() //obliczanie obwodu bez zwracania
{
    _obwod = 2*a+2*b;
}

ostream& operator<< (ostream& out, Prostokat& punkt)    //przeciazenie wyswietlania obiektu
{
    out << "Wartosci prostokata: " << punkt.a << " " << punkt.b << " " << punkt._obwod  << endl;
    return out;
}



class Bryla{
 char * kolor;
      public:
             Bryla(char *k){
                 kolor=new char[strlen(k)+1];
                 strcpy(kolor,k);
             }
};

class Kula{
 double r;
      public:
        Kula(double _r){
                 r=_r;
             }
        double objetosc(){
           return 4.0/3*3.14*r*r;
        }
};

class Kwadrat{
              double a;
public:
        Kwadrat(double _a){
            a=_a;
        }
        double dlugosc(){
             return 4*a;
        }
        void wypisz(){
          cout<<"a="<<a<<" ";
        }
};

class Kolo :Figura //stworzenie dziedziczenia z klasy Figura
{
protected:
	double r;
public:
     Kolo(double _r, char *n)
		 :Figura(n)
      {
          r=_r;
       }

     double pole(){
          return 3.14*r*r;
       }

       double dlugosc(){
             return 3.14*2*r;
       }
	   void obwod();
	   void wypisz()
	   {
	       Figura::wypisz();
	   }
};
void Kolo::obwod()
{
}

int main()
{
    Figura *figurki[3];
    Prostokat p1("Prostokat", 5, 7);
    Kolo k1(2,"Kolo");
    figurki[0] = &p1;
    figurki[1] = &k1;
/*
    Kolo k1(3, "nazwa");
    k1.wypisz();
    Prostokat p1("prosto", 5, 6);
    p1.wypisz();
    p1.obwod();
    cout << endl;
    cout << p1;
  */
    return 0;
}

||=== Build: Debug in kolokwium 2 konstruktor (compiler: GNU GCC Compiler) ===|
D:\kolokwium 2 konstruktor\main.cpp||In function 'int main()':|
D:\kolokwium 2 konstruktor\main.cpp|111|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
D:\kolokwium 2 konstruktor\main.cpp|112|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
D:\kolokwium 2 konstruktor\main.cpp|114|error: 'Figura' is an inaccessible base of 'Kolo'|
||=== Build failed: 1 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|

 

Czemu przy dodaniu p1 do tablicy jest wszystko ok a przy k1 juz nie i jak dodac do tej tablicy obiekt Figury jesli jest abstrakcyjna klasa?

komentarz 23 lutego 2016 przez Radfler VIP (101,030 p.)

Klasa koło powinna dziedziczyć publicznie z klasy Figura, a ty dziedziczysz prywatnie :p

Podobne pytania

0 głosów
2 odpowiedzi 3,928 wizyt
pytanie zadane 26 stycznia 2019 w C# przez boniek Nowicjusz (190 p.)
0 głosów
1 odpowiedź 1,230 wizyt
pytanie zadane 3 marca 2017 w Java przez moofi Początkujący (470 p.)
0 głosów
2 odpowiedzi 207 wizyt

92,632 zapytań

141,502 odpowiedzi

319,882 komentarzy

62,015 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!

...