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

Konstruktor, dziedziczenie i funkcja strcpy

VPS Starter Arubacloud
0 głosów
590 wizyt
pytanie zadane 20 lutego 2016 w C i C++ przez Turqus Obywatel (1,420 p.)
Witam, mam 2 pytania, jedno chodzi odnosnie strcpy poniewaz wywala mi blad

'This function or veriable may be unsafe' Consider using strcpy_instead.

A drugi mam problem poniewaz musze poprawic konstruktor w klasie Kolo z funkcji bazowej Figura i mam pytanie jesli dziedzicze z klasy Figura musze przepisac argumenty z jego konstruktora w tej klasie? Czy co robie zle, co musze zrobic?

http://wklej.org/id/1979479/

1 odpowiedź

0 głosów
odpowiedź 20 lutego 2016 przez Patrycjerz Mędrzec (192,340 p.)
  1. Pewnie programujesz w Visual C++ - po prostu kompilator stwierdził, że funkcja strcpy nie jest bezpieczna i proponuje strcpy_instead.
  2. Nie rozumiem... wywołujesz sobie konstruktor klasy bazowej w liście inicjalizacyjnej - jaki chcesz.
komentarz 20 lutego 2016 przez Turqus Obywatel (1,420 p.)
Powiedzmy ze usune liste inicjalizacyjna co musze poprawic zeby konstruktor dzialal?
komentarz 20 lutego 2016 przez Patrycjerz Mędrzec (192,340 p.)
Jeśli zdefiniujesz w klasie konstruktor z argumentami, to automatycznie traci ona konstruktor domyślny - musisz go ręcznie stworzyć. Obiekt klasy pochodnej wywołuje automatycznie konstruktor domyślny klasy bazowej, ale tylko wtedy, gdy istnieje - gdy go nie ma, musisz go stworzyć lub wywołać jawnie inny konstruktor w liście inicjalizacyjnej.
komentarz 20 lutego 2016 przez Turqus Obywatel (1,420 p.)

Troche po mojemu bo nie ogarniam takich hasel tak od razu, wszystko do glowy mi na raz nie wejdzie :P

poprawilem intuicyjnie tak jak powiedziales teraz pytanie czy dobrze i czy o to chodzilo

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

Jesli tworze klase pochodna (ta ktora dziedziczy) z klasy bazowej, ktora ma konstruktor musze uzupelnic argumenty w liscie inicjalizacyjnej?

Co to znaczy "jawnie"

komentarz 20 lutego 2016 przez Patrycjerz Mędrzec (192,340 p.)

Tak, w rzeczy samej, taki kod jest poprawny, tylko wrzucaj go w przyszłości do specjalnej ramki na kod wink

Tak, ponieważ klasa Figura nie posiada konstruktora domyślnego - zostaje ci jedynie konstruktor ze wskaźnikiem i musisz go w takiej sytuacji wywołać (lub stworzyć konstruktor domyślny klasy Figura).

Jawnie, w tym przypadku, znaczy samemuręcznie.

komentarz 20 lutego 2016 przez Turqus Obywatel (1,420 p.)

Ok jeszcze jedno ciag dalszy zeby nie spamowac forum nowym tematem, mam pytanie

Jesli klasa bazowa Figura jest klasa abstrakcyjna, zawierajaca wirtualna metode obwod i dziedziczac z niej musze uwzglednic wirtualna metode obwod tez i dlaczego?

 

I majac taki kod zrodlowy: (po paru rozwiazanych zadaniach natrafiłem na jedno takie :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;
		}    //proba stworzenia konstruktora

    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()
{
    Kolo k1(3, "nazwa");
    k1.wypisz();
    Prostokat p1("prosto", 5, 6);
    p1.wypisz();
    cout << p1;
    
    return 0;
}

 

Przedstawić działanie polimorfizmu na podstawie obiektow powyzszych klas(Figura, Prostokat, Kolo) zapisanych w tablicy (3'elementowej) i metody obwod

Nie prosze o rozwiazanie tylko troche bardziej rozbudowana wypowiedz jak do tego sie zabrac z naciskiem na info odnosnie tablicy 3 elementowej jak zadeklarowac. Z gory dziekuje :)

komentarz 21 lutego 2016 przez Sedi Stary wyjadacz (10,200 p.)

Widze, że zadanie domowe. Wytłumacz o co chodzi z tym pytaniem:

Jesli klasa bazowa Figura jest klasa abstrakcyjna, zawierajaca wirtualna metode obwod i dziedziczac z niej musze uwzglednic wirtualna metode obwod tez i dlaczego?

Chcesz się dowiedzieć dlaczego tak się dzieje ?

  • Jeśli tak, to nie zrozumiałeś polimorfizmu :P Wytłumaczę to prosto. Masz klasę A,B,C. Polimorfizm polega na tym, że mogę stworzyć kod, który jest łatwo rozszerzalny. Tzn. Załóżmy, że klasa A będzie wirtualna. Czyli:
class A
{

public:
virtual void wypisz()=0;

};

class B:public A{

virtual void wypisz()

{

std::cout<<"Hej, jestem B";

}

};

class C:public A{

virtual void wypisz(){std::cout<<"Hej, jestem C";}

}

  • Wyobraź sobie, że jesteśmy w lesie. Klasa B, to Niedźwiedź. Klasa C, to wilk. Natomiast klasa A, to po prostu... zwierze. Ogólne zwierze. I teraz wyobraź sobie, że w lesie są jeszcze ptaki, które mają jeszcze inną klasę o jakże kreatywnej nazwie D. Są jeszcze gady i płazy. Załóżmy, że w lesie pojawiło się nowe zwierzę, np. lis. Więc wprowadzam do bazy lisa. Kim jest lis ? Zwierzęciem, więc korzystam z klasy A. Teraz powiesz, po co ?
  1. Po pierwsze wprowadza porządek. Wyobraź sobie, że mamy 1000 stworzeń w lesie. Z czego większość to gady. Chcemy znaleźć Naszego Lisa. Mamy polimorfizm, więc patrzymy TYLKO na zwierzęta i szukamy. Z racji tego, że ograniczyliśmy przedział tylko do zwierząt, nie szukamy po glizdach, robakach, itd.(Dla uproszczenia).
  2. W lesie pojawia się żubr. Dodaje go więc za pomocą polimorfizmu do klasy zwierzę.Gdybym nie miał polimorfizmu kod straciłby czytelność. Gdyż mogę w łatwy sposób dodać, a potem usunąć daną klasę, nie wiedząc o jej istnieniu.
  3. Wyobraźmy sobie, że chcemy obserwować żubra. Żubr jest zwierzęciem, więc jest prosto. Cyk i mamy go. Wyobraź sobie, że chcemy nadzorować również kretoszczura, modliszkę i inne robactwa. Tworzymy więc virtualną klasę obserwator. Klasy wywodzące, mogą być dla każdego zwierzęcia osobne lub takie same. Dzięki temu możemy prosto obserwować zwierzęta i to co robią :P

I tyle :P

 

Jeśli natomiast nie o to chodzi, napisz o co.

Pozdrawiam :)

Podobne pytania

0 głosów
3 odpowiedzi 261 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez akiihombre Początkujący (250 p.)
0 głosów
1 odpowiedź 142 wizyt
pytanie zadane 27 czerwca 2018 w C i C++ przez 99xkubax99 Obywatel (1,780 p.)
0 głosów
1 odpowiedź 187 wizyt
pytanie zadane 22 maja 2017 w C i C++ przez Sensej Użytkownik (540 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...