Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wekstor o typie będącym klasą

Ostatnio zmodyfikowano 2016-12-27 01:52
Autor Wiadomość
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...
P-155491
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.
P-155493
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.
P-155497
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 :)
C/C++
#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() ) ) // wyswietla nazwy wydarzen - wsk to iterator - wskazuje na pierwszy element
            {
                cout <<( wsk + i )->jakanazwa() << endl; // dzieki carlos za pomoc z tym
                i++;
            }
            i = 0; // i = 0, bo przeciez moze bedziemy chcieli jeszcze raz skorzystac z listy
            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; // jesli znalazlo wydarzenie to wyswietla nazwe i zmienia na true
                }
            }
            if( !czy_wyswietlilo ) // jesli nie znaleziono wydarzenia to wyswietl:
                 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 ) // jeszcze raz carlos - pomysl z referencja
{
    wektor.push_back( Data( godzina, minuta, dzien, miesiac, nazwa ) ); //dzieki KarambaHPZ za pokazanie jak wywolac tu kontruktor :)
}
P-155500
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.
P-155501
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?
P-155502
1 « 2 »
Poprzednia strona Strona 2 z 2