Studiuje informatykę 1 rok , nigdy nie miałem nic wspólnego z programowaniem , ale po jakimś czasie zaczęło mi sie to podobać , teraz mam programowanie obiektowe , mam nadzieje ze będziesz dodawał częściej te poradniki bo są 3 razy lepsze od moich wykładów. Dzieki że to robisz.
Myślę, że warto dodać, że istnieje coś takiego jak this->name = name. Niektórzy uważają, że jest to niejasne, ale moim zdaniem zwiększa przejrzystość kodu - w każdym razie warto wiedzieć. Świetny kurs, pomaga przyswoić i usystematyzować wiedzę na temat OOP.
WIADOMOSC DLA LUDNOŚCI. Przenioslem sie w czasie z dnia 6 sierpnia 1945r. Nie jest dobrze. Jest nas coraz mniej😢 Apokalipsa nas wykańcza. 1 LIKE to -1 ZOMBIE
no, ale nie mało w nim błędów :) zalecam napisanie i sprawdzenie samodzielnie, o niektórych sprawach nie wspomniano co powoduje trudność napisania własnego programu.
do osoby czytającej to po 6.sierpnia.2045: Mam nadzieję, że ten fenomenalny kurs przyda ci się np. do zaprogramowania działka maszynowego chroniącego twój bunkier przed atakami zombiaków. Powodzenia! :/
Dobry odcinek - jasno i prosto wytłumaczone. Przydał by się jeszcze odcinek o tym jak programista powinien sprzątać po obiektach. W Cpp często tworzy się dość rozbudowane,skomplikowane struktury danych (listy obiektów, listy wskaźników do obiektów, Obiekt które posiadają obiekty jako atrybut itp). Taki byłby odpowiedni następny odcinek ;)
Dla pedantów i tych którzy nie wyłapali błędu i mają problem z kompilacją podaję poprawki znalezionych błędów: 1). W 9:04 w instrukcji if wdarł się błąd - zamiast: if(napis=="" || s
Świetny odcinek, co prawda naciąłem się kiedy zrobiłem drugi konstruktor zmieniający ostatnia daną minuty aby tak jak było powiedziane nie trzeba klepać wszystkich argumentów z lewej strony i wtedy zapis Event w1; nie działa trzeba dać nawiasy i zdecydować się na któryś konstruktor to właśnie przeciążenie nazwy wcześniej nie rozumiałem tego ;) Brakło może przykładu w filmie z dwoma konstruktorami ale i tak bomba!! Dzięki za poświęcony czas i pasję do programowania.
Pierwszy filmik, który był dla mnie prawie zupełnie nowy i mogę powiedzieć, że wszystko zrozumiałem dzięki Panu. Dwa małe pytanka miałem, ale google pomogło ;) Super :) Szkoda, że zadanka domowego nie było ;) Najlepiej jak dotyczą omawianego tematu :)
Witam! Jeśli dobrze widzę, to od 9:12 parametry wywołania metody wczytaj() obiektu p1 w main(), a później parametry całego konstruktora nie zgadzają się z deklaracją metody i konstruktora, tzn. w deklaracji mamy string i 2 x int, a podczas wywołań 2 x int i string na końcu. Poza tym świetny kurs - ogląda się z miłą chęcią. Pozdrawiam
Jeżeli dobrze rozumiem, to taki zapis działałby tylko wtedy kiedy to nazwa konstruktora byłaby zapisana w pliku z nagłówkami, natomiast kod znajdujący się w środku zapisany byłby w pliku .cpp .
Naprawdę dobra robota z tym kursem. Szkoda tylko że już dawno nie było żadnego odcinka. Pewnie już podstawy wyjaśniłeś. Ale to nie szkodzi żeby dodać jeszcze trochę informacji w dodatkowych odcinkach bo naprawdę genialnie to przedstawiasz:)
Odnośnie 29:40, oczywiście że nazwa argumentu formalnego w konstruktorze może być taka sama jak nazwa zmiennej składowej klasy. Wystarczy użyć operatora this->nazwa = nazwa, aby wszystko zadziałało poprawnie.
Szanowny Panie Mirosławie, gratuluję kanału. Przez lata brakowało darmowych materiałów o takiej jakości zarówno merytorycznej jak i dźwiękowo-wizualnej. Jednakże, muszę przyznać, że powinien Pan popracować nad wypowiedzią (mam na myśli np.: "w cudzysłowiu", "generalnie", "totalnie", "prawda?").
nauke zaczynałem od zera, teraz gdy oglądam i pisze kod 3-4 raz to rozumiem przekazywane treści,naprawdę wszystko jest tu mega dobrze wytłumaczone,jedynie wskaźniki są dla mnie problemem
Dzięki Panie Mirosławie za poradniczek :) jesteś nie tylko idealnym nauczycielem,ale także idealnym celem dla reklamodawców.Podczas oglądania tego filmu wyświetliła mi się 6 razy reklama udemy :P Polecasz może tę platformę?
9:14 przy sprawdzaniu instrukcji if jest błąd, sprawdzanie warunku string, trzeba zdefiniować co ma być sprawdzone, w tym przypadku pusta spacja, bez niej kompilator uczyni warunek prawdziwy i zawsze będzie wypisane ERROR. Tak myślę, czy nie mam racji? Wydaje sie, że powinno być: napis==" ", a nie napis==""
Dzień dobry, mam pytanie, czy np. w minucie 9:43 (ale wcześniej i później też) w if-ie wewnątrz funkcji wczytaj nie powinno być n=="", zamiast napis=="" ?
Świetne Nagranie. Tak to ja się mogę uczyć :-). Konkretnie, klarowne, spójnie, ułożone w porządku. Wielkie dzięki za nagranie. Teraz Widzę jakie te konstruktory i destruktory są dobre. Pytanie na marginesie Nie obrażę się jeśli nie odpowiesz, bo pytanie nie jest krótkie. Czy można taką kontrolę (hermetyzację) osiągnąć w C, gdyż dużo programuje sprzętu sensory, silniki, ledy, mikrokontrolery itp. Są tam w zasadzie "polecenia" static i extern, ale do końca nie wiem jak to rozwiązać.
8:58 nie powinno tam być p1.szerokosc = 100; zamiast szerokosc = 100; ? 17:54 Dlaczego zaraz błąd? Wskaźnik zawierałby śmieci. Gorzej jakby się chciało coś tam do tej komórki pamięci wpisać. Dobrze rozumiem?
Mnie zawsze uczono, że odczytać coś zawsze można. Niekiedy nie ma to sensu jak np. śmieci w zmiennej. Ale to nie psuje programu. Co innego jak wstawiamy jakąś wartość. Później program może nam się sypać nie wiadomo z jakiego powodu. Ciężko jest takie coś potem wychwycić a debuggując stracimy na pewno sen z powiek. Znaczy ja chcę tylko wypisać zawartość. Nie chcę pod żaden inny obiekt podstawiać wartości tej pokazywanej na wskaźnik. 30:22 Nie mógłbym nazwać argumentu string name i skorzystać z operatora zakresu? Event::name = name; w taki sposób?
No tak to już wtedy jest bardzo niebezpieczne i ciężko takie zjawisko kontrolować. Bardzo udany był dzisiejszy odcinek. Mam nadzieję, że rekruci nie będą mieli problemów ze zrozumieniem :) A co do mojego zapytania: Event::name = name; mógłbym tak użyć?
powinno, niezaleznie, czy te atrybuty sa publiczne, czy prywatne, musimy sie do nich odwoolac poprzez obiekt klasy czyli np. p1.szerokosc, gdyby byly prywatne to p1.szerokosc by nie bylo dostepne
30:00 - czy czasami globalna zmienna "name" nie zostanie zasłonięta? wtedy name=name; nie zrobi nic (tzn prawdopodobnie wykona się przypisanie, ale wartość się nie zmieni)
Ciekawostka: Jeżeli w klasie występuje kilka konstruktorów i przy wywoływaniu obiektu nie podamy żadnych argumentów to kod się nie skompiluje. Tak samo jest, kiedy np. nie podamy wszystkich argumentów, a argumenty które podaliśmy pasowałyby do kilku konstruktorów.
Witam. Czy będzie dodawał Pan filmy dotyczące zadań z matury rozszerzonej? Maturę będę pisać w przyszłym roku i chciałbym się przygotować do takich zadań jakie tam występują (a w szkole nie mam na co liczyć, wszystko we własnym zakresie muszę organizować :) )
***** Mam pytanie trochę z innej beczki. Jak zabrać się za zadanie o treści: "dane są suma i iloczyn dwóch liczb całkowitych. Napisz program znajdujący te liczby". Nie liczę oczywiście na rozwiązanie, ale na jakieś wskazówki. Dziękuję.
Już mam rozwiązanie. Kod (pierwiastków): a=(s-sqrt(pow(s, 2)-4*i))/2; b=(s+sqrt(pow(s, 2)-4*i))/2; I wszystko działa jak należy. Nie pojmuję natomiast dlaczego zamiast = nie mogłem użyć ==. Wydawało mi się, że znak równości powinien być uznany.
Witam. Z uwagą oglądam i odbieram przygotowaną przez pana wiedzę w filmach i tylko u pana potrafię w "mój" sposób przyjąć do siebie tą wiedzę. Mam również pytanie czy po zakończeniu kursu C++ napisze pan program ze (może nie) wszystkimi lekcjami ? To również pomogło by nowym programistom (takim jak ja) jak wygląda taki porządny program. Sam mam ambitne plany do C++ głownie do gier :) Dziękuję za kolejny wspaniały film. Życzę miłego dnia do zobaczenia.
Nie wiem czy już ktoś to już pisał i Pan na to odpowiedział, ale kiedyś, gdy poznawałem dzielenie programu na pliki, to zostałem poinformowany, że nie powinno się w każdym pliku dodawać tych samych bibliotek. W przypadku programu pisanego przez Pana w tym odcinku wystarczyło wpisać "#include " w pliku nagłówkowym, a ponieważ plik ten jest podłączony do wszystkich innych .cpp w programie, to cały program może korzystać z tej biblioteki. Jest jakiś specjalny powód, dlaczego dodawał Pan to we wszystkich plikach?
9:37 jet błąd, argumenty wchodzące w procedury mają przypisaną swoją konkretną kolejność, nie można przy wywoływaniu procedury zmienić tej kolejności, czyż nie?
@@deathlotos522 słuszna racja, sprawdziłem na swoim przykładzie i jest jak napisałeś. Co więcej, o ile się nie mylę, kolejność argumentów w konstruktorze musi być zapisywana od tyłu z listy definicji atrybutów, inaczej program nie działa. Pozdrawiam.
Bardzo fajna seria poradników, ale mam pytanie do 13:48 Tam jest : Przycisk(string="OK", int=100, int = 25) a zastanawia mnie dlaczego nie tak : Przycisk(string n="OK", int s=100, int w=25) w tym pierwszym przykładzie skąd kompilator ma wiedzieć że int 100 to szerokość ??
Michał Szymocha Faktycznie, jest to błąd. Gdyby jednaki taki zapis pojawił się wcześniej jako deklaracja (np. w pliku nagłówkowym), a w definicji podano by zapis z nazwami argumentów, (już bez wartości domniemanych,) wszystko byłoby ok. Jakbyś chciał dokładne wyjaśnienie tego mechanizmu, to jest w Symfonii C++ w rozdziale "Funkcje -> Ciekawostki na temat argumentów domniemanych" (u mnie strona 130). Jest tak, że deklaracja (nie definicja) funkcji informuje kompilator jedynie o typie i ilości argumentów. Z tego faktu wynika, że nazwy argumentów można przy deklaracjach pomijać. Przykład z symfonii dwóch równoważnych deklaracji: void f(int pierwszy, double drugi); void f(int, double); Jeżeli ktoś ma w zwyczaju nie pisać nazw przy deklaracjach, to przy deklarowaniu argumentów domniemanych (Pan Mirosław mówi domyślnych) nie musi się odzwyczajać :) Pisze się wtedy właśnie w taki dziwny sposób: void f(int = 4, double = 20); I wszystko gra. Podsumowując, poprawny będzie taki fragment programu: void f(int = 4, double = 20); void f(int pierwszy, double drugi) {//ciało procedury} I równoznaczne jest to zapisowi: void f(int pierwszy = 4, double drugi = 20) {//ciało procedury}
Mam problem z ponizszym zadaniem a jest to bardzo pilna sprawa z poziomu studiów , od której zalezy bardzo wiele klasa Zamowienie z polami pryw. int*towary - wsk tablicy z lista tow w zamowieniu. double *ceny - wsk tabl z cenami poszczeg. tow w zamówieniu int maxPoz zamowienie na moze miec wiecej niz maxPoz (towarow) int ilePoz akt. liczba poz. zamówienia Metody: konstruktor z parametrem (int maxPoz) okresla max liczbe pozycji w zam. , konstruktor powinien nadac odpowiednie wartosci wszytskim polom klasy void dodajPozycje(int idTowaru, double cenaTowaru) funk. dodaje towar do listy el. zamowienia jesli jest miejsce double najdrozszyTowar() f zwraca identyfikator towaru(z tablicy towary)ktorego koszt jest najwiekszy , w przypadku gdy zamowienie jest puste wynikiem jest -1 double kosztCalkowity() f zwrca sumaryczny koszt zamowienia destruktor. pastebin.com/HuYhRyDy (moje proby) Bardzo prosze o pomoc to bardzo ważne.
dobrze, no to tak to pozamieniam, a np w tym konstruktorze: musze przypisac wartosci, i kompletnie nie wiem jakie. one sa dowolne , jak w konstruktorze domyslnym? bo on mi tu wyglada na nieco inny niż w zadaniu event, gdzie pierw w klasie był konstruktor ze stringiem i intami, pozniej w ~event::event tam bylu juz podane typy i literki(odpowiadajace np day, month,year) i potem bylo year=y; itd..
Mam pytanie - w 30:11 powiedział Pan żeby dać argument w konstruktorze np n, żeby nie mieszało się. I w związku z tym mam pytanie - czy można użyć zamiast n, name, a potem użyć this ( np. event(string name){ this->name = name;} ) ? Bardzo fajne filmy
nie działa u mnie gdy mam klasę w oddzielnym pliku event.h a jak już dodałem do głównego pliku wszystko zaczęło mi działać wszystko jak należy o co może chodzić? edit: biblioteka #include "event.h" nie działa moim zdaniem w tym może być problem i korzystam z visual studio code. wyskakuje że main.exe nie istnieje
13:39 czy na pewno zapis Przycisk(string="OK", int=100, int=50) jest poprawny? Nie powinno być Przycisk(string s="OK" itd.? No bo co jeśli będę chciał zrobić przycisk z innymi wartościami? Skąd będzie wiadomo, że drugi argument konstruktora to wysokość a nie szerokość?
Jeszcze zapytam. Jak brzmiała funkcja, która czekała przez jakiś czas wyrażony w minisekundach? Pamiętam, że coś takiego chyba widziałem w pańskim kursie.
Panie Mirosławie, mówił Pan, że po użyciu konstruktora domyślnego cały czas mamy możliwość późniejszego wczytania danych np. z klawiatury. Ja właśnie pracuję nad takim programem, w którym użytkownik sam wpisuje dane albo wybiera je jako domyślne(działanie konstruktora domyślnego). Natomiast w dalszej części programu gdzie działa inna klasa, która dziedziczy od opisywanej poprzednio dane są cały czas pobierane z konstruktora domyślnego, nie z metody wczytaj();, to jak to w końcu jest?
Jeśli chodzi o klasy, to spotkałem się z dwoma pojęciami, tzw. Rule of Three, czyli zasadą mówiącą o tym, że klasa musi mieć konstruktor, destruktor, i operator przypisania; oraz Rule of Zero, czyli zasadą mówiącą o tym, że klasa nie musi mieć żadnego z poprzednio wymienionych elementów, więc czy stwierdzenie że zawsze powinno się definiować konstruktor nie jest błędne ? W przypadku Rule of Zero, konstruktor nie występuje, natomiast kompilator sam może sobie ten konstruktor wygenerować.
Czy domyślnymi wartościami w konstruktorze mogą być inne dane pobierane np rzeczywista data (pobierana w momencie uruchomienia danego konstruktora teraz ) ?
Lekki błąd z twojej strony, przy konstruktorze w argumentach możesz podać tą samą nazwę co w klasie, lecz przy zmiennych zawartych w klasie trzeba będzie dodać przestrzeń w jakiej się znajduje w tym przypadku np Event::hour lub po prostu this->hour jeżeli zmienna znajduje się w tej samej klasie co metoda, warto tak pisać z tego powodu że przy wywoływaniu konstuktora kompilator może nam podpowiedzieć co będziemy wprowadzać
Poza tym, to nadal nie ma sensu. Ten zapis byłby poprawny jeżeli definiowałbyś konstruktor poza klasą: Klasa::Klasa(int i){ .... } A w klasie Klasa(int = 10); Ponieważ w kodzie Pana M. Zelenta, nigdzie nie zostały zarezerwowane nazwy zmiennych s, w i n.
Witam. Mam pytanie do pana Mirosława Zelenta. Chciałbym się dowiedzieć ile odcinków z kursu języka html i kursu języka css jeszcze będzie na kanale i mniej więcej kiedy one się pojawią? Domyślam się, że gdyby weszły np. jakieś nowe znaczniki to odcinek może nagle się pojawić, ale chodzi mi o odcinki, które są już zaplanowane. Z góry dziękuję za odpowiedź. ;)
Tak patrzę i wnioskuję że z tymi klasami i obiektami to tak trochę jakby pisać program ( klasę ) piszący program ( obiekty dziedziczące ) ( wiem to trochę dziwne podejście = mała rekuręcja i papka bananowo kiełbasiana )
Witam, czy poleca Pan uczenie się w międzyczasie (w oczekiwaniu na kolejne filmiki z pańskiej serii) innego języka, np. PHP? Czy lepiej skupić się póki co na C++ a dopiero po skończeniu kursu zabrać się za co innego?
Wiele języków jest podobnych to siebie - różnią się detalami Cpp jest zdecydowanie najtrudniejszy bo wymaga najwięcej uwagi od programisty/projektanta sys. Np. Java to taki uproszczony Cpp, posiada GC który sprząta po programiście.
+wrzaskun000 Teoretycznie nie jest sprawdzany 2 razy. :) Sprawdza go tylko instrukcja if, a while to już pętla, która wykonuje się tyle razy, ile razy zmienna mianownik jest przyrównywana do 0.
Nie za bardzo rozumiem. Prosiłbym o krótkie rozjaśnienie. 1. Niżej jakiś widz pisze dlaczego w 13:48 nie nadaje Pan w konstruktorze nazw poszczególnym typom danych. Jednak w programie o Eventach, również Pan nie podaje nazw w konstruktorze np. 28:55, tylko same typy danych a mimo to działa. 2. Podaje Pan, iż nadając konstruktorowi wartości domyślne w momencie tworzenia, nie można tworzyć obiektu już w inny sposób. Mi jednak to działa. Zmodyfikowałem trochę Pana program i poniżej wklejam kod (ze wszystkich trzech plików - podpisałem w komentarzach je). Wszystkie trzy sposoby mi się kompilują. wklej.org/id/1605298/ 3. Apropo pierwszego punktu, to chodzi mi linijke 13 z mojego, powyższego kodu Event(string="brak",int=01,int=01,int=2015,int=8,int=00); nie powinno być Event(string n="brak", int d=01.......int m=00); ? - tak jak to pisał jeden z widzów poniżej? Dlaczego to działa?
Studiuje informatykę 1 rok , nigdy nie miałem nic wspólnego z programowaniem , ale po jakimś czasie zaczęło mi sie to podobać , teraz mam programowanie obiektowe , mam nadzieje ze będziesz dodawał częściej te poradniki bo są 3 razy lepsze od moich wykładów. Dzieki że to robisz.
Bardzo przydatny kurs, Pan tłumaczy to w najlepszy sposób, jaki się da
Pięknie rozegrana lekcja nawiązująca do całości wsześniejszego materiału. Wiedza i dydaktyka, najlepiej wyłożony materiał z jakim miałem zetknięcie!
Myślę, że warto dodać, że istnieje coś takiego jak this->name = name. Niektórzy uważają, że jest to niejasne, ale moim zdaniem zwiększa przejrzystość kodu - w każdym razie warto wiedzieć. Świetny kurs, pomaga przyswoić i usystematyzować wiedzę na temat OOP.
może jestem głupi, ale jak to zastosowałem to błąd krytyczny :P
WIADOMOSC DLA LUDNOŚCI.
Przenioslem sie w czasie z dnia 6 sierpnia 1945r. Nie jest dobrze. Jest nas coraz mniej😢 Apokalipsa nas wykańcza.
1 LIKE to -1 ZOMBIE
Boże, jaki ten kurs jest wspaniały !
no, ale nie mało w nim błędów :) zalecam napisanie i sprawdzenie samodzielnie, o niektórych sprawach nie wspomniano co powoduje trudność napisania własnego programu.
do osoby czytającej to po 6.sierpnia.2045: Mam nadzieję, że ten fenomenalny kurs przyda ci się np. do zaprogramowania działka maszynowego chroniącego twój bunkier przed atakami zombiaków. Powodzenia! :/
No niestety, zombie apokalipsa nie nadeszła. Zamiast tego użyłem tego tutoriala żeby zrobić wechikuł czasu :)
Wehikuł*
może zasady ortografii uległy zmianie do 2045
morze
Dopiero końcem 2045 roku weszła ustawa o zmianie ortografii, więc kolega jest po prostu debilem.
Pozdrawiam!
Po wielu próbach, nareszcie zrozumiałam konstruktory, dziękuję ! :)
Świetny kurs. Niesamowicie umiejętne przekazanie wiedzy :)
Jeszcze raz dziękuję )))
Wielki szacunek dla pana :) swietny kurs
Jak zawsze świetnie wytłumaczone
Dobry odcinek - jasno i prosto wytłumaczone.
Przydał by się jeszcze odcinek o tym jak programista powinien sprzątać po obiektach. W Cpp często tworzy się dość rozbudowane,skomplikowane struktury danych (listy obiektów, listy wskaźników do obiektów, Obiekt które posiadają obiekty jako atrybut itp). Taki byłby odpowiedni następny odcinek ;)
super sprawa pozdrawiam pomogłeś mi bardzo
38:32
TAAAK
Dziękuję bardzo za te podsumowania!!
:D
Jak super! Świetny z Pana nauczyciel, dziękuję :)
Kurs jest świetny. Nic dodać nic ująć.
Mimo, że filmy były robione już dawno, to tłumaczą dużo lepiej niż nawet angielskie tuttoriale
Bardzo dziękuje! Dzięki Panu zdałem kolokwium z programowania obiektowego :) Pozdrawiam!
dziękuję Panu !)
Dziekuje, pozdrawiam.
Dla pedantów i tych którzy nie wyłapali błędu i mają problem z kompilacją podaję poprawki znalezionych błędów:
1). W 9:04 w instrukcji if wdarł się błąd - zamiast:
if(napis=="" || s
Świetny odcinek, co prawda naciąłem się kiedy zrobiłem drugi konstruktor zmieniający ostatnia daną minuty aby tak jak było powiedziane nie trzeba klepać wszystkich argumentów z lewej strony i wtedy zapis Event w1; nie działa trzeba dać nawiasy i zdecydować się na któryś konstruktor to właśnie przeciążenie nazwy wcześniej nie rozumiałem tego ;) Brakło może przykładu w filmie z dwoma konstruktorami ale i tak bomba!! Dzięki za poświęcony czas i pasję do programowania.
Pierwszy filmik, który był dla mnie prawie zupełnie nowy i mogę powiedzieć, że wszystko zrozumiałem dzięki Panu. Dwa małe pytanka miałem, ale google pomogło ;) Super :) Szkoda, że zadanka domowego nie było ;) Najlepiej jak dotyczą omawianego tematu :)
Jem śniadanie i oglądam odcinek Pana Mirosława... Czego chcieć więcej... ;)
Witam!
Jeśli dobrze widzę, to od 9:12 parametry wywołania metody wczytaj() obiektu p1 w main(), a później parametry całego konstruktora nie zgadzają się z deklaracją metody i konstruktora, tzn. w deklaracji mamy string i 2 x int, a podczas wywołań 2 x int i string na końcu.
Poza tym świetny kurs - ogląda się z miłą chęcią. Pozdrawiam
o ile się nie mylę w tym przypadku kolejność liczy się dla zmiennych tego samego typu
A gdzie praca domowa???? :(
Świetny materiał. Może w przyszłości doda Pan omówienie podstawowych wzorców na podstawie c++? Często pytano mnie o nie na rozmowach o pracę.
13:50
A skad konstruktor - konretnie ten if wie co ma porownać? Chodzi mi to np. "s
Też na to zwróciłem uwagę
Zrobiłem tak jak ty mówisz i dopiero mi zadziałało
Też właśnie na to zwróciłem uwagę i dlatego zszedłem do komentarzy, żeby zobaczyć jak miałoby to działać xD
Jeżeli dobrze rozumiem, to taki zapis działałby tylko wtedy kiedy to nazwa konstruktora byłaby zapisana w pliku z nagłówkami, natomiast kod znajdujący się w środku zapisany byłby w pliku .cpp .
Naprawdę dobra robota z tym kursem. Szkoda tylko że już dawno nie było żadnego odcinka. Pewnie już podstawy wyjaśniłeś. Ale to nie szkodzi żeby dodać jeszcze trochę informacji w dodatkowych odcinkach bo naprawdę genialnie to przedstawiasz:)
Odnośnie 29:40, oczywiście że nazwa argumentu formalnego w konstruktorze może być taka sama jak nazwa zmiennej składowej klasy. Wystarczy użyć operatora this->nazwa = nazwa, aby wszystko zadziałało poprawnie.
dziekuje
dzieki mordo
Świetny odcinek.
Jak się trochę popracuję co wieczór to wszystko się da nauczyć :)
20:40 - 👀 Jak to globalnie? Ale nam nauczyciel mówił że nic nie można robić globalnie
Świetnie jak zawsze
Szanowny Panie Mirosławie,
gratuluję kanału. Przez lata brakowało darmowych materiałów o takiej jakości zarówno merytorycznej jak i dźwiękowo-wizualnej. Jednakże, muszę przyznać, że powinien Pan popracować nad wypowiedzią (mam na myśli np.: "w cudzysłowiu", "generalnie", "totalnie", "prawda?").
dziękuję!
jak zwykle świetny odcinek.oby ich jak najwiecej:)
0:48 Żyjemy w klasach
Ten pachelbell w tle zawsze będzie mi się kojarzył z Pana filmami
nauke zaczynałem od zera, teraz gdy oglądam i pisze kod 3-4 raz to rozumiem przekazywane treści,naprawdę wszystko jest tu mega dobrze wytłumaczone,jedynie wskaźniki są dla mnie problemem
do zobaczenia za 21 lat
Dzięki Panie Mirosławie za poradniczek :) jesteś nie tylko idealnym nauczycielem,ale także idealnym celem dla reklamodawców.Podczas oglądania tego filmu wyświetliła mi się 6 razy reklama udemy :P Polecasz może tę platformę?
Super Film, dziekuje :D
O! nie było zadania? No to sam sobie stworzę... :) Dzięki za kolejny odcinek...
Można też zaznaczyć, że nagłówek można też dodać przez File>New..>File..
w końcu porządny kurs ;)
super :) notatki też bardzo pomocne ^^
10:57 - a ja to rozumiem tak że typem zwracanej wartości przez metodę konstruktora "Przycisk" jest właśnie obiekt klasy "Przycisk"
9:14 przy sprawdzaniu instrukcji if jest błąd, sprawdzanie warunku string, trzeba zdefiniować co ma być sprawdzone, w tym przypadku pusta spacja, bez niej kompilator uczyni warunek prawdziwy i zawsze będzie wypisane ERROR. Tak myślę, czy nie mam racji? Wydaje sie, że powinno być: napis==" ", a nie napis==""
2:35, a gdyby nie dawać tego if'a i był by sam while?
Nie było by go czasem lepsze rozwiązanie?
Do nauki potrzeba dwóch rzeczy: czasu i wysiłku. Ty włożyłeś wysiłek za mnie więc musiałem tylko poświęcić czas :)
2:53- czyli w nierzeczywistych się da?
20:52 obiekty statyczne nie trzeba inicjalizować zerem, bo są one zaraz po stworzeniu nim zainicjalizowane.
Dzień dobry,
mam pytanie, czy np. w minucie 9:43 (ale wcześniej i później też) w if-ie wewnątrz funkcji wczytaj nie powinno być n=="", zamiast napis=="" ?
michal234486 : też miałem o to zapytać :) wychodzi na to, że to błąd.
@@tabletborys7643 @29:33 tłumaczy dlaczego to co napisałeś jest poprawne
Znając 2020 rok to właśnie 2020 powinien tam być ale ok
Świetne Nagranie. Tak to ja się mogę uczyć :-). Konkretnie, klarowne, spójnie, ułożone w porządku. Wielkie dzięki za nagranie. Teraz Widzę jakie te konstruktory i destruktory są dobre.
Pytanie na marginesie Nie obrażę się jeśli nie odpowiesz, bo pytanie nie jest krótkie. Czy można taką kontrolę (hermetyzację) osiągnąć w C, gdyż dużo programuje sprzętu sensory, silniki, ledy, mikrokontrolery itp. Są tam w zasadzie "polecenia" static i extern, ale do końca nie wiem jak to rozwiązać.
***** Okej dzięki za info poszperam co nieco.
19:58 powinno być understand, bez s :P
23:24
Wyobraź sobie , że to błąd w pisaniu słowa quit :P
8:58 nie powinno tam być p1.szerokosc = 100; zamiast szerokosc = 100; ?
17:54 Dlaczego zaraz błąd? Wskaźnik zawierałby śmieci. Gorzej jakby się chciało coś tam do tej komórki pamięci wpisać. Dobrze rozumiem?
Mnie zawsze uczono, że odczytać coś zawsze można. Niekiedy nie ma to sensu jak np. śmieci w zmiennej. Ale to nie psuje programu. Co innego jak wstawiamy jakąś wartość. Później program może nam się sypać nie wiadomo z jakiego powodu. Ciężko jest takie coś potem wychwycić a debuggując stracimy na pewno sen z powiek.
Znaczy ja chcę tylko wypisać zawartość. Nie chcę pod żaden inny obiekt podstawiać wartości tej pokazywanej na wskaźnik.
30:22 Nie mógłbym nazwać argumentu string name i skorzystać z operatora zakresu?
Event::name = name; w taki sposób?
No tak to już wtedy jest bardzo niebezpieczne i ciężko takie zjawisko kontrolować. Bardzo udany był dzisiejszy odcinek. Mam nadzieję, że rekruci nie będą mieli problemów ze zrozumieniem :)
A co do mojego zapytania:
Event::name = name; mógłbym tak użyć?
powinno, niezaleznie, czy te atrybuty sa publiczne, czy prywatne, musimy sie do nich odwoolac poprzez obiekt klasy czyli np. p1.szerokosc, gdyby byly prywatne to p1.szerokosc by nie bylo dostepne
30:00 - czy czasami globalna zmienna "name" nie zostanie zasłonięta? wtedy name=name; nie zrobi nic (tzn prawdopodobnie wykona się przypisanie, ale wartość się nie zmieni)
Ciekawostka:
Jeżeli w klasie występuje kilka konstruktorów i przy wywoływaniu obiektu nie podamy żadnych argumentów to kod się nie skompiluje. Tak samo jest, kiedy np. nie podamy wszystkich argumentów, a argumenty które podaliśmy pasowałyby do kilku konstruktorów.
Witam.
Czy będzie dodawał Pan filmy dotyczące zadań z matury rozszerzonej?
Maturę będę pisać w przyszłym roku i chciałbym się przygotować do takich zadań jakie tam występują (a w szkole nie mam na co liczyć, wszystko we własnym zakresie muszę organizować :) )
*****
Mam pytanie trochę z innej beczki. Jak zabrać się za zadanie o treści:
"dane są suma i iloczyn dwóch liczb całkowitych. Napisz program znajdujący te liczby". Nie liczę oczywiście na rozwiązanie, ale na jakieś wskazówki. Dziękuję.
Już mam rozwiązanie. Kod (pierwiastków):
a=(s-sqrt(pow(s, 2)-4*i))/2;
b=(s+sqrt(pow(s, 2)-4*i))/2;
I wszystko działa jak należy.
Nie pojmuję natomiast dlaczego zamiast = nie mogłem użyć ==. Wydawało mi się, że znak równości powinien być uznany.
Już rozumiem. Dziękuję :)
I jak poszła maturka? ;)
Witam. Z uwagą oglądam i odbieram przygotowaną przez pana wiedzę w filmach i tylko u pana potrafię w "mój" sposób przyjąć do siebie tą wiedzę. Mam również pytanie czy po zakończeniu kursu C++ napisze pan program ze (może nie) wszystkimi lekcjami ? To również pomogło by nowym programistom (takim jak ja) jak wygląda taki porządny program. Sam mam ambitne plany do C++ głownie do gier :) Dziękuję za kolejny wspaniały film. Życzę miłego dnia do zobaczenia.
Nie wiem czy już ktoś to już pisał i Pan na to odpowiedział, ale kiedyś, gdy poznawałem dzielenie programu na pliki, to zostałem poinformowany, że nie powinno się w każdym pliku dodawać tych samych bibliotek. W przypadku programu pisanego przez Pana w tym odcinku wystarczyło wpisać "#include " w pliku nagłówkowym, a ponieważ plik ten jest podłączony do wszystkich innych .cpp w programie, to cały program może korzystać z tej biblioteki. Jest jakiś specjalny powód, dlaczego dodawał Pan to we wszystkich plikach?
9:37 jet błąd, argumenty wchodzące w procedury mają przypisaną swoją konkretną kolejność, nie można przy wywoływaniu procedury zmienić tej kolejności, czyż nie?
Wydaje mi sie, ze masz racje. Dodatkowo 13:39 chyba brakuje nazwy zmiennej przy okreslaniu argumentu domyslnego.
@@deathlotos522 słuszna racja, sprawdziłem na swoim przykładzie i jest jak napisałeś. Co więcej, o ile się nie mylę, kolejność argumentów w konstruktorze musi być zapisywana od tyłu z listy definicji atrybutów, inaczej program nie działa. Pozdrawiam.
Bardzo fajna seria poradników, ale mam pytanie do 13:48
Tam jest :
Przycisk(string="OK", int=100, int = 25)
a zastanawia mnie dlaczego nie tak :
Przycisk(string n="OK", int s=100, int w=25)
w tym pierwszym przykładzie skąd kompilator ma wiedzieć że int 100 to szerokość ??
***** dzięki za szybką odpowiedź.
Pozdrawiam i z okazji nowego roku życzę Ci natchnienia w dalszym tworzeniu poradników.
Michał Szymocha Faktycznie, jest to błąd. Gdyby jednaki taki zapis pojawił się wcześniej jako deklaracja (np. w pliku nagłówkowym), a w definicji podano by zapis z nazwami argumentów, (już bez wartości domniemanych,) wszystko byłoby ok. Jakbyś chciał dokładne wyjaśnienie tego mechanizmu, to jest w Symfonii C++ w rozdziale "Funkcje -> Ciekawostki na temat argumentów domniemanych" (u mnie strona 130).
Jest tak, że deklaracja (nie definicja) funkcji informuje kompilator jedynie o typie i ilości argumentów. Z tego faktu wynika, że nazwy argumentów można przy deklaracjach pomijać.
Przykład z symfonii dwóch równoważnych deklaracji:
void f(int pierwszy, double drugi);
void f(int, double);
Jeżeli ktoś ma w zwyczaju nie pisać nazw przy deklaracjach, to przy deklarowaniu argumentów domniemanych (Pan Mirosław mówi domyślnych) nie musi się odzwyczajać :) Pisze się wtedy właśnie w taki dziwny sposób:
void f(int = 4, double = 20);
I wszystko gra. Podsumowując, poprawny będzie taki fragment programu:
void f(int = 4, double = 20);
void f(int pierwszy, double drugi)
{//ciało procedury}
I równoznaczne jest to zapisowi:
void f(int pierwszy = 4, double drugi = 20)
{//ciało procedury}
13.40 zgłaszam błąd - brak nazwy zmiennych w konstruktorze przy domyslnym wywolywaniu. BARDZO MERYTORYCZNY MATERIAL ! DZIEKI ! :]
Mam problem z ponizszym zadaniem a jest to bardzo pilna sprawa z poziomu studiów , od której zalezy bardzo wiele
klasa Zamowienie z polami pryw.
int*towary - wsk tablicy z lista tow w zamowieniu.
double *ceny - wsk tabl z cenami poszczeg. tow w zamówieniu
int maxPoz zamowienie na moze miec wiecej niz maxPoz (towarow)
int ilePoz akt. liczba poz. zamówienia
Metody:
konstruktor z parametrem (int maxPoz) okresla max liczbe pozycji w zam. , konstruktor powinien nadac odpowiednie wartosci wszytskim polom klasy
void dodajPozycje(int idTowaru, double cenaTowaru) funk. dodaje towar do listy el. zamowienia jesli jest miejsce
double najdrozszyTowar() f zwraca identyfikator towaru(z tablicy towary)ktorego koszt jest najwiekszy , w przypadku gdy zamowienie jest puste wynikiem jest -1
double kosztCalkowity() f zwrca sumaryczny koszt zamowienia
destruktor.
pastebin.com/HuYhRyDy (moje proby)
Bardzo prosze o pomoc to bardzo ważne.
dobrze, no to tak to pozamieniam, a np w tym konstruktorze:
musze przypisac wartosci, i kompletnie nie wiem jakie. one sa dowolne , jak w konstruktorze domyslnym?
bo on mi tu wyglada na nieco inny niż w zadaniu event, gdzie pierw w klasie był konstruktor ze stringiem i intami, pozniej w ~event::event tam bylu juz podane typy i literki(odpowiadajace np day, month,year) i potem bylo year=y; itd..
Dobrze. bardzo dziękuje :)
nie chciałem Panu zawracac glowy , niestety musiałem zapytać, jeszcze raz dziękuje
8:48 Dlaczego jest "szerokosc", "wysokosc", "napis" a nie p1.szerokosc, p1.wysokosc, p1.napis?
Wydaje mi się że to tylko tak dydaktycznie było pokazane, później w programie pisze poprawnie, jeśli się mylę proszę popraw mnie :d
9:30 a nie lepiej byłoby po prostu zadeklarować unasigned int?
Co racja to racja, im wiecej razy obejrzysz, tym lepiej rozumiesz :)
W jaki sposób ustawić wartość domyślną w konstruktorze, który znajduje się w klasie?
w swift sie olewa kontruktory bo maja computed properties. ;)
Mam pytanie - w 30:11 powiedział Pan żeby dać argument w konstruktorze np n, żeby nie mieszało się. I w związku z tym mam pytanie - czy można użyć zamiast n, name, a potem użyć this ( np. event(string name){ this->name = name;} ) ?
Bardzo fajne filmy
nie działa u mnie gdy mam klasę w oddzielnym pliku event.h a jak już dodałem do głównego pliku wszystko zaczęło mi działać wszystko jak należy o co może chodzić?
edit: biblioteka #include "event.h" nie działa moim zdaniem w tym może być problem i korzystam z visual studio code.
wyskakuje że main.exe nie istnieje
13:39 czy na pewno zapis Przycisk(string="OK", int=100, int=50) jest poprawny? Nie powinno być Przycisk(string s="OK" itd.? No bo co jeśli będę chciał zrobić przycisk z innymi wartościami? Skąd będzie wiadomo, że drugi argument konstruktora to wysokość a nie szerokość?
Poza tym w 9:07 powinno być if(n == "" || s
Jeszcze zapytam. Jak brzmiała funkcja, która czekała przez jakiś czas wyrażony w minisekundach? Pamiętam, że coś takiego chyba widziałem w pańskim kursie.
Panie Mirosławie, mówił Pan, że po użyciu konstruktora domyślnego cały czas mamy możliwość późniejszego wczytania danych np. z klawiatury. Ja właśnie pracuję nad takim programem, w którym użytkownik sam wpisuje dane albo wybiera je jako domyślne(działanie konstruktora domyślnego). Natomiast w dalszej części programu gdzie działa inna klasa, która dziedziczy od opisywanej poprzednio dane są cały czas pobierane z konstruktora domyślnego, nie z metody wczytaj();, to jak to w końcu jest?
2:40 nic nie zmieni bo scope jest prywatny (ani nie wczyta)
Witam. Czy bedzie nastepny odcinek cyklu? Pozdrawiam i dzieki za kurs.
17:48 - Ale jak to? Przecież odwołanie się do adresu NULL, kończy działanie programu.
Jeśli chodzi o klasy, to spotkałem się z dwoma pojęciami, tzw. Rule of Three, czyli zasadą mówiącą o tym, że klasa musi mieć konstruktor, destruktor, i operator przypisania; oraz Rule of Zero, czyli zasadą mówiącą o tym, że klasa nie musi mieć żadnego z poprzednio wymienionych elementów, więc czy stwierdzenie że zawsze powinno się definiować konstruktor nie jest błędne ? W przypadku Rule of Zero, konstruktor nie występuje, natomiast kompilator sam może sobie ten konstruktor wygenerować.
Świetny poradnik. Jaką poleca pan książkę do dalszego rozwijania wiedzy w języku c++.
***** Dziękuję za odpowiedź nad wyborem się zastanowie.
Znowu musiałem rozbić odcinek na dwa podejścia. To nie problem, bo lepiej, kiedy jest za dużo informacji, niż za mało. :)
Czy domyślnymi wartościami w konstruktorze mogą być inne dane pobierane np rzeczywista data (pobierana w momencie uruchomienia danego konstruktora teraz ) ?
Lekki błąd z twojej strony, przy konstruktorze w argumentach możesz podać tą samą nazwę co w klasie, lecz przy zmiennych zawartych w klasie trzeba będzie dodać przestrzeń w jakiej się znajduje w tym przypadku np Event::hour lub po prostu this->hour jeżeli zmienna znajduje się w tej samej klasie co metoda, warto tak pisać z tego powodu że przy wywoływaniu konstuktora kompilator może nam podpowiedzieć co będziemy wprowadzać
13:36 ale to nie powinno działać.
Przycisk(string="OK", int=100, int=25) ale jaki string oraz dwa inty.
Knayder na dalszych etapach programowania dowiesz się o zmiennych bezimiennych...
Trochę się spóźniłeś. C++ już dużo bardziej ogarniam :D
Poza tym, to nadal nie ma sensu.
Ten zapis byłby poprawny jeżeli definiowałbyś konstruktor poza klasą:
Klasa::Klasa(int i){
....
}
A w klasie
Klasa(int = 10);
Ponieważ w kodzie Pana M. Zelenta, nigdzie nie zostały zarezerwowane nazwy zmiennych s, w i n.
Zostaly zarezerwowane
Przecież jak można zmiennym przypisać wartość zmiennych bezimiennych ? trzeba je nazwać !
Witam. Mam pytanie do pana Mirosława Zelenta. Chciałbym się dowiedzieć ile odcinków z kursu języka html i kursu języka css jeszcze będzie na kanale i mniej więcej kiedy one się pojawią? Domyślam się, że gdyby weszły np. jakieś nowe znaczniki to odcinek może nagle się pojawić, ale chodzi mi o odcinki, które są już zaplanowane. Z góry dziękuję za odpowiedź. ;)
A skad wiadomo do jakich parametrow zostana przypisane wartosci domyslne konstruktora skoro nie ma tam nazw zmiennych ? Chodzi o slajd w min. 13.45
Jeżeli mamy szalenie dużo atrybutów, to możemy jakoś inaczej (szybciej,prościej ) ustawić atrybuty w konstruktorze ?
Tak patrzę i wnioskuję że z tymi klasami i obiektami to tak trochę jakby pisać program ( klasę ) piszący program ( obiekty dziedziczące ) ( wiem to trochę dziwne podejście = mała rekuręcja i papka bananowo kiełbasiana )
ale pan wie chyba wszystko co wiadomo o konstruktorach i destrukcji WIELKI SZACUN DLA PANA I PANA ZIOMALI
Kiedy poradnik zaczyna się od Kanonu D Pachelbela i już wiesz, że będzie dobry.
Witam, czy poleca Pan uczenie się w międzyczasie (w oczekiwaniu na kolejne filmiki z pańskiej serii) innego języka, np. PHP? Czy lepiej skupić się póki co na C++ a dopiero po skończeniu kursu zabrać się za co innego?
Wiele języków jest podobnych to siebie - różnią się detalami Cpp jest zdecydowanie najtrudniejszy bo wymaga najwięcej uwagi od programisty/projektanta sys. Np. Java to taki uproszczony Cpp, posiada GC który sprząta po programiście.
***** To może spytam jakie języki Pan poleca po C++?
Jedyny kanał na yt ze słusznymi tagami filmu.
Dlaczego w 2:45 mianownik jest 2x sprawdzany, w "if" a potem w "while"?
+wrzaskun000 Teoretycznie nie jest sprawdzany 2 razy. :) Sprawdza go tylko instrukcja if, a while to już pętla, która wykonuje się tyle razy, ile razy zmienna mianownik jest przyrównywana do 0.
Podoba mi się że używa Pan angielskich nazw zmiennych.
Nie za bardzo rozumiem. Prosiłbym o krótkie rozjaśnienie.
1. Niżej jakiś widz pisze dlaczego w 13:48 nie nadaje Pan w konstruktorze nazw poszczególnym typom danych. Jednak w programie o Eventach, również Pan nie podaje nazw w konstruktorze np. 28:55, tylko same typy danych a mimo to działa.
2. Podaje Pan, iż nadając konstruktorowi wartości domyślne w momencie tworzenia, nie można tworzyć obiektu już w inny sposób. Mi jednak to działa. Zmodyfikowałem trochę Pana program i poniżej wklejam kod (ze wszystkich trzech plików - podpisałem w komentarzach je). Wszystkie trzy sposoby mi się kompilują.
wklej.org/id/1605298/
3. Apropo pierwszego punktu, to chodzi mi linijke 13 z mojego, powyższego kodu
Event(string="brak",int=01,int=01,int=2015,int=8,int=00);
nie powinno być Event(string n="brak", int d=01.......int m=00); ? - tak jak to pisał jeden z widzów poniżej? Dlaczego to działa?
*****
doszedłem już jakiś czas temu do tego, jednakże dziękuje za odpowiedź :)