latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-26 23:13:40 Hmmm... troche zbiło mnie to z tropu... w końcu to tablica, a zawsze pracujemy na oryginale a nie kopii...
|
|
carlosmay |
» 2016-12-26 23:17:54 w końcu to tablica, a zawsze pracujemy na oryginale a nie kopii... |
To tablica opakowana w klasę, a to co innego niż goła tablica. Obiekt klasy należy przekazać przez referencję lub wskaźnik, jak przy zmiennych typów wbudowanych. |
|
mokrowski |
» 2016-12-26 23:54:41 Pomyśl o tym jak o intencji "co będę robił". 1. Jeśli chcę modyfikować przekazywany argument i ma to być niewidoczne poza funkcją, argument przekazuję przez kopię. 2. Jeśli chcę modyfikować przekazywany argument i ma to być widoczne poza funkcją, argument przekazuję przez referencję. 3. Jeśli chcę uzyskać dostęp do argumentu i nie chcę go modyfikować, argument przekazuję przez stałą referencję. 4. Jeśli chcę uzyskać dostęp do argumentu i chcę go modyfikować oraz są przypadki że nie będzie on dostępny, przekazuję przez wskaźnik i badam czy wskaźnik nie pokazuje na nullptr (lub NULL dla C++ przed 2011). 5. Jeśli chcę uzyskać dostęp do argumentu i nie chcę go modyfikować oraz są przypadki że nie będzie on dostępny, przekazuję przez wskaźnik stały i badam czy wskaźnik nie pokazuje na nullptr (lub NULL dla C++ przed 2011).
O referencjach prawostronnych i inteligentnych wskaźnikach już nie piszę bo to wystarczy na 1 raz :-) Przeczytaj uważnie i wyobraź sobie funkcję jako czarne pudełko które w bardzo różny sposób działa. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-27 00:43:00 3. Jeśli chcę uzyskać dostęp do argumentu i nie chcę go modyfikować, argument przekazuję przez stałą referencję. |
skoro nie chcemy go modyfikować, to po co przez referencję, a nie przez stałą kopię? funkcja( const typ argument ) I co to znaczy oraz są przypadki że nie będzie on dostępny |
co to za przypadki ? :p PS. skończyłem, nie wiem czy ktoś bedzie zainteresowany, ale na wszelki wypadek pokrótce objaśnię: Program służy do zapisywania wydarzeń, tworzymy liste takich wydarzeń a następnie mamy ich liste i wywołujemy je po nazwie. Od razu mówię, program był do zapoznania się z wektorami, NIE zrobiłem zabezpieczenia przed wpisywaniem w polu miesiąc liczby większej niz 12 lub mniejszej od 1, to samo dzien, godzina i minuty. Nie zrobilem rowniez takiego zapisu godziny 10:00, tylko 10:0 . Dlaczego? Bo to już umiem a to tylko ćwiczenie. Zrobiłem za to zabezpiecznie przed nie wpisaniem nazwy wydarzenia przy szukaniu (opcja 2) oraz przed wpisaniem zlej nazwy. Uwagi? Porady? Mile widziane :) #include <iostream> #include <vector> #include <windows.h> using namespace std; class Data { int lgodzin; int lminut; int dzien; int miesiac; string nazwa; public: Data( int godz, int minu, int day, int mon, string name ) : lgodzin( godz ) , lminut( minu ) , dzien( day ) , miesiac( mon ) , nazwa( name ) { } Data() { lgodzin = 0; lminut = 0; dzien = 0; miesiac = 0; nazwa = "brak"; } string jakanazwa() { return this->nazwa; } void info() { cout << "\n---------------------------\n" << nazwa << endl << "---------------------------\n" << lgodzin << ":" << lminut << endl << dzien << "." << miesiac; } };
void utworz_wydarzenie( vector < Data >& wektor, int dzien, int miesiac, int godzina, int minuta, string nazwa ); int main() { bool czy_wyswietlilo = false; int opcja, godzina, minuta, dzien, miesiac, i = 0; string nazwa; vector < Data > tablica; vector < Data >::iterator wsk; while( 1 ) { wsk = tablica.begin(); cout << "1. utworz wydarzenie\n" << "2. lista wydarzen\n"; cin >> opcja; system( "cls" ); switch( opcja ) { case 1: cout << "podaj nazwe: "; cin.ignore(); getline( cin, nazwa, '\n' ); cout << "podaj godzine: "; cin >> godzina; cout << "podaj minute: "; cin >> minuta; cout << "podaj dzien: "; cin >> dzien; cout << "podaj miesiac: "; cin >> miesiac; utworz_wydarzenie( tablica, dzien, miesiac, godzina, minuta, nazwa ); cout << "zapisano...\n\n"; break; case 2: if( tablica.size() == 0 ) break; cout << "ktore wydarzenie chcesz wyswietlic?\n"; while(( wsk + i != tablica.end() ) ) { cout <<( wsk + i )->jakanazwa() << endl; i++; } i = 0; cin.ignore(); getline( cin, nazwa, '\n' ); for( int l = 0; l < tablica.size(); l++ ) { if(( wsk + l )->jakanazwa() == nazwa ) { ( wsk + l )->info(); czy_wyswietlilo = true; } } if( !czy_wyswietlilo ) cout << "nie odnaleziono wydarzenia"; cout << endl << endl; break; default: return 0; } } }
void utworz_wydarzenie( vector < Data >& wektor, int dzien, int miesiac, int godzina, int minuta, string nazwa ) { wektor.push_back( Data( godzina, minuta, dzien, miesiac, nazwa ) ); }
|
|
mokrowski |
» 2016-12-27 01:06:54 Dlaczego nie przez stałą kopię? A wyobraź sobie vector z 1 milionem elementów. Chcesz go kopiować do funkcji? Po co? Strata czasu. Zabezpieczasz się przez const że go "nie dotkniesz" i przekazujesz referencję :-) Te przypadki gdzie nie będzie prawidłowego wskaźnika na argument to np. sytuacja gdzie w programie nie wykonano zaalokowania tego kontenera i ustawiono wskaźnik na nullptr.
|
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-27 01:52:26 Dlaczego nie przez stałą kopię? A wyobraź sobie vector z 1 milionem elementów. Chcesz go kopiować do funkcji? |
No tak, w sumie tak samo robimy z tablicami - też wysyłamy przez referencję :) No to wszystko wiem, trochę nie jestem pewien co do sytuacja gdzie w programie nie wykonano zaalokowania tego kontenera i ustawiono wskaźnik na nullptr. |
chodzi Ci o dynamiczną alokację kontenera, czyli wektora i ustawienie wskaźnika na nullptr? |
|
1 « 2 » |