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

C++ dziedziczenie !

Object Storage Arubacloud
0 głosów
536 wizyt
pytanie zadane 3 lipca 2015 w C i C++ przez Wiciorny Ekspert (270,190 p.)

Piszę sobie program ćwicząc zastosowanie konstruktorów przy je

#include <iostream>



using namespace std;



class Event
{
     public:
    int year;
    int day;
    int mouth;
    int godzina, minuta;
    string nazwa;


        Event(string n, int y, int m, int d,int g, int mins)
{

    //to co dostal event niech wpisze do atrybutow
    //kolejnosc ma znaczenie bo program czyta od LEWEJ DO PRAWEJ, czyli  "nazwie przypisz to co ma n"
    nazwa=n;
    year=y;
    mouth=m;
    day=d;
    godzina=g;
    minuta=mins;

}
        void zapisz()
        {
                cout<<"Podaj nazwe wydarzenia: "<<endl;
                cin>>nazwa;
                cout<<"Podaj rok,miesiac i dzien tego wydarzenia: "<<endl;
                cin>>year>>mouth>>day;

                cout<<"Podaj godzine i minute : "<<endl;
                cin>>godzina>>minuta;

        }

        void pokaz()
        {
            cout<<"Twoje wydarzenie: "<<endl;
            cout<<nazwa<<year<<"."<<mouth<<"."<<day<<endl;
            cout<<"Godzina: "<<godzina<<":"<<minuta;

        }
};

/*--------------------------------------------------------------------*/
/*DRUGI PRZYKLAD KONSTRUKTORA DOMYSLNEGO */

//dziedzicze aby nie pisac funkcji od nowa
class DomyslnyEvent:public Event
{
    public:
    // nazwa rodzica Event zostaje przyslonieta nazwa tutejsza
    string nazwa;
    //konstruktor domyslny !
    DomyslnyEvent(string nazwa= "Domyslna",int year=1999, int mouth=1,int day=1,int godzina=10, int minuta=30){};

    //wywolanie metody z klasy Event
    Event::pokaz();

};



int main()
{   Event w1("Urodzinki",2015,8,23,10,00);

    w1.pokaz();

    DomyslnyEvent w2;
    w2.pokaz();



    return 0;
}

esnym dziedziczeniu 

Jest pewien problem mianowicie chcialem w 1  pliku wywloac najpierw obiekt z wartosciami konstruktora nie domyslnego, tutaj  [ W1 ]

Drugi obiekt z clasy DomyslnyEvent-  

Wiadomo do w1- inicjuje wartosci, bo nie ma konstruktora domyslnego, jednak do w2[OBIEKTU KLASY Z DOMYSLNYM KONSTRUKTOREM] nie wpisalem jednak wysypuja mi sie bledy 

Kod jak u góry.Dalej błedy jakie wysypują się to : 

ISO C++ forbids declaration of 'pokaz' with no type [-fpermissive]|

cannot declare member function 'Event::pokaz' withi'DomyslnyEvent'

In constructor 'DomyslnyEvent::DomyslnyEvent(std::string, int, int, int, int, int)':||

no matching function for call to 'Event::Event()'|

itp. generalnie co tu jest zrobione nie tak? Podejzewam, ze jakby wywolanie funkcji pokaz traktuje jako element klasy Event i potrzebuje wartosci. Z góry dzieki za pomoc i zainteresowanie ! 

 

1 odpowiedź

+2 głosów
odpowiedź 3 lipca 2015 przez daan Pasjonat (17,640 p.)
wybrane 3 lipca 2015 przez Wiciorny
 
Najlepsza

co to jest za wywołanie Event::pokaz ? gdzie Cie tego nauczyli :D tak się nie robi :) nie możesz wywołać metody tak o jak chcesz i gdzie chcesz, wyrzuć to, klasa DomyslnyEvent odziedziczy metode pokaz z klasy Event, nie musisz jej deklarowac.

dalej, klasa event ma swój konstruktor, który nie przypisuje wartości domyślnych więc wymagane jest jego użycie, powinieneś wywołać ten konstruktor na liście inicjalizacyjnej konstruktora DomyslnyEvent. (i co robi tam średnik po {} ??)

DomyslnyEvent(string nazwa = "Domyslna", int year = 1999, int mouth = 1, int day = 1, int godzina = 10, int minuta = 30)
		: Event(nazwa, year, mouth, day, godzina, minuta)
	{
	}
komentarz 3 lipca 2015 przez Wiciorny Ekspert (270,190 p.)
wywołanie metody z klasy podstawowej w klasie Pochodnej...

tutaj link w filmie Pana Mirosława.

 https://youtu.be/ZesZXlBcROA

Druga sprawa DomyslnyEvent jest konstruktorem domyslnym dla klasy DomyslnyEvent..

W klasie Event, jest inny niedomyślny konstruktor- ale one  nie maja ze soba miec nic wspolnego, obiekt W1 ma parametry dla konstruktora z klasy Event i do niej nalezy a obiekt W2 ma byc obiektem klasy DOMYSLNEJ i tworzyc sie z uzyciem konstruktora w tej klasie .

I czytaj co dokladnie pisze Klasa Event nie ma miec domyslnego konstruktora ale druga ma miec, a chcialem zeby odziedziczyc same nazwy zmiennych... aby nie pisac ich 2 razy a nie zeby wartosci.

Oczekuje jednak pomocy a nie wytkniecia co jest nie tak i pozostawienia tego ...

zreszta to co powiedziales ni jak sie ma do mojego problemu bo chyba go nie zrozumiales
komentarz 3 lipca 2015 przez daan Pasjonat (17,640 p.)
edycja 3 lipca 2015 przez daan

oczekujesz pomocy znaczy gotowca czy jak ? bo ja Ci starałem się pokazać co nie działa ...

.. nie możesz wywołać metedy w deklaracji klasy :P

co do konstruktora faktycznie mój błąd, nie musisz podawać żadnych danych więc może on zostać wywołany jako domyślny :) 

i ty też przeczytaj to co napisałem, wywołać konstruktor klasy Event powinieneś w klasie DomyslnyEvent, ponieważ klasa Event NIE MA DOMYŚLNEGO KONSTRUKTORA ewentualnie zamiast tego możesz od nowa ustawiać wszystkie zmienne w nowym konstruktorze czyli pisać ten sam kod od nowa.. nie polecam

bardzo prosze jak sądze o to Ci chodziło :

#include <iostream>
#include <string>

using namespace std;

class Event
{
public:
	int year;
	int day;
	int mouth;
	int godzina, minuta;
	string nazwa;

	Event(string n, int y, int m, int d, int g, int mins)
	{
		nazwa = n;
		year = y;
		mouth = m;
		day = d;
		godzina = g;
		minuta = mins;
	}

	void zapisz()
	{
		cout << "Podaj nazwe wydarzenia: " << endl;
		cin >> nazwa;
		cout << "Podaj rok,miesiac i dzien tego wydarzenia: " << endl;
		cin >> year >> mouth >> day;

		cout << "Podaj godzine i minute : " << endl;
		cin >> godzina >> minuta;

	}

	void pokaz()
	{
		cout << "Twoje wydarzenie: " << endl;
		cout << nazwa << year << "." << mouth << "." << day << endl;
		cout << "Godzina: " << godzina << ":" << minuta;

	}
};

class DomyslnyEvent : public Event
{
public:
	string nazwa;
	
	DomyslnyEvent(string nazwa = "Domyslna", int year = 1999, int mouth = 1, int day = 1, int godzina = 10, int minuta = 30)
		: Event(nazwa, year, mouth, day, godzina, minuta)
	{
	}
};

int main()
{
	Event w1("Urodzinki", 2015, 8, 23, 10, 00);
	w1.pokaz();

	DomyslnyEvent w2;
	w2.pokaz();

	return 0;
}

 

komentarz 3 lipca 2015 przez Wiciorny Ekspert (270,190 p.)
Teraz dziekuje dziala, tylko dlaczego wpisac nalezalo konstruktor do drugiej klasy?

Chodzilo mi o to, zeby konstruktor klasy jednej byl niedomyślny ... czyli trzeba bylo mu nadac wartosc, a konstruktor w 2 klasie byl domyslny i z gory mielismy narzucone wartosci, do tego chcialem po prostu uniknac pisania jeszcze raz nazw zmiennych wiec sadzilem, ze dziedziczenie to zalatwi. Generalnie, co bylo przyczyna bledu.? Umialbys jeszcze to wyjasnic "lapatologicznie "

Ps przepraszam, honor zwracam- dziekuje za pomoc
komentarz 3 lipca 2015 przez daan Pasjonat (17,640 p.)
Jasne, nie ma problemu, na szybko pisałem więc mogło byś troche "pokręcone" ;)

Główną przyczyną błędu było to, że konstruktor klasy DomyslnyEvent owszem, nadawał wartosci domyślne ale zmiennym które powinny zostać przekazane, a nie tym które dziedziczy ta klasa, czyli mówiąc po ludzku "jeżeli użytkownik nie poda żadnych wartości, to wywołaj konstruktor DomyslnyEvent("Domyslna", 1999, 1, 1, 10 ,30)" tyle, że w twoim kodzie nic z tymi zmiennymi się nie działo, jak sam napisałeś chciałeś uniknąć klonowania kodu po raz kolejny, w efekcie konstruktor domyślny klasy DomyslnyEvent faktycznie działał ale nic nie robił, a konstruktor klasy Event oczekiwał konkretnych zmiennych, których nie dostał. Generalnie ważne jest to żeby wiedzieć, że klasa która dziedziczy z innej klasy, wywołuje konstruktor swojej klasy bazowej, dlatego pokazał Ci błąd, że nie ma takiego konstruktora Event::Event().

Podobne pytania

+1 głos
3 odpowiedzi 1,714 wizyt
pytanie zadane 8 stycznia 2016 w C i C++ przez PoProstuTomasz Początkujący (470 p.)
0 głosów
1 odpowiedź 364 wizyt
pytanie zadane 22 grudnia 2019 w C i C++ przez Jacuchna0 Użytkownik (640 p.)
0 głosów
1 odpowiedź 198 wizyt
pytanie zadane 16 lipca 2015 w C i C++ przez criss Mędrzec (172,590 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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!

...