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

c++ struktury i klasy.

Ostatnio zmodyfikowano 2010-02-15 18:12
Autor Wiadomość
Bartaz
Temat założony przez niniejszego użytkownika
c++ struktury i klasy.
» 2010-02-14 13:28:52
Witam mam problem dlaczego nie działa mi takie cos
jak zrobic zeby to zadzialalo?
C/C++
struct panstwo
{
    int cena = 370;
};
panstwo hiszpania;
lub
C/C++
class panstwo
{
public:
    int cena = 370;
};
panstwo grecja;
P-13876
WunM
» 2010-02-14 13:44:39
Dowiedz się co to są konstruktory i destruktory to pogadamy.
P-13877
Bartaz
Temat założony przez niniejszego użytkownika
...
» 2010-02-14 13:46:08
ok
P-13878
wojos
» 2010-02-14 14:50:33
Nie możesz przypisywać wartości od razu w klasie, tym musi zająć się już obiekt (nie wiem jak ze strukturami bo praktycznie nigdy z nich nie korzystałem). Jeżeli chcesz, by zmienna w jakiejś klasie zawsze miała tą samą wartość przy tworzeniu obietu - przypisujesz jej żądaną wartość w konstruktorze:
C/C++
//ze względu na miejsce funkcje i konstruktory i destruktor zaimplementowane są prosto w klasie (nie jest to zabronione)
class PANSTWO
{
public:
    PANSTWO() { itsCost = 370; } //Konstruktor domyślny
    PANSTWO( int Cost ) { itsCost = Cost; } //Konstruktor z parametrem "Cost"
    ~PANSTWO() { }; //Destruktor - nic nie robi
   
    int GetCost() { return itsCost; } //Akcesor zwracający wartość zmiennej itsCost
    void SetCost( int newCost ) { itsCost = newCost; } //Akcesor ustawiający zmienną "itsCost"
private:
    int itsCost; //Cost - cena, jeżeli ktoś nie umie angielskiego ;P
};

To jest już trochę bardziej złożona klasa niż ta, którą pokazałeś Ty, jest w niej przestrzeń prywatna - dostęp do niej zapewniają akcesory GetCost() i SetCost(int newCost).
Jeżeli chciałbyś zrobić tą klasę tak jak wcześniej (choć nie jest to rozwiązanie eleganckie i przy większych projektach mogłoby stać się niebezpieczne), to żeby przypisać zmiennej cena wartość domyślną i tak musisz zaimplementować konstruktor domyślny:
C/C++
//prosta klasa PANSTWO:
class PANSTWO
{
public:
    PANSTWO() { cena = 500; }
   
    int cena;
    /*w przypadku gdy zmienna jest w przestrzeni publicznej klasy wszystko ma do niej bezpośredni dostęp i może to przy skomplikowanych projektach stworzyć trudne do wykrycia błędy*/
};
W tej klasie przy tworzeniu obiektu jego zmienna "cena" zawsze będzie ustawiana na wartość 500.
P-13879
Elaine
» 2010-02-14 16:34:06
Za przypisania w konstruktorze powinni wieszać za jaja (zwłaszcza, jeśli przypisujemy do czegoś, co nie jest typu prostego)... Listy inicjalizacyjne do czegoś zostały stworzone.
P-13880
dmx81
» 2010-02-14 23:23:42
C/C++
class C_poziom1
{
public:
    int i_x, i_y, i_s, i_w;
    bool b_disp;
    BITMAP * obrazek;
    C_poziom1();
    C_poziom1( int x, int y, int s, int w );
   
};
C_poziom1::C_poziom1( int x, int y, int s, int w )
{
    i_x = x;
    i_y = y;
    i_s = s;
    i_w = w;
}
masz tu przyklad z mojego kawalka kodu, jak widzisz, najpierw okreslamy, jakie zmienne beda przechowywane w obiektach danej klasy, pozniej tworzymy konstruktor, a pozniej wystarczy cos takiego:
C_poziom1 obiekt( 4, 11, 33, 55 );
mam nadzieje, ze rozumiesz o co chodzi, ewenualnie mozesz nadac jakas wartosc w ten sposob - bool nadaje poza konstruktorem
C/C++
C_poziom1 strzala1( 800, 75, 15, 5 ); strzala1.b_disp = false;
strzala1.obrazek = load_bmp( "strzala.bmp", default_palette );
nie wiem, czy moj sposob jest 100% poprawny, poniewaz rownierz dopiero sie ucze, ale wlasnie w ten sposob wszystko dziala mi poprawnie :) i mam co chce pod kontrola
P-13891
WunM
» 2010-02-15 11:15:28
C/C++
class MyClass {
    int x, y;
public:
    int z;
    MyClass( int x, int y, int z )
        : x( x )
        , y( y )
        , z( z )
    { }
};
P-13896
wojos
» 2010-02-15 18:12:23
Ok to może jeszcze wspomnę o listach inicjalizacyjnych.
Możesz przypisać zmiennym wartości jeszcze przed wywołaniem właściwego ciała konstruktora i wyglądałoby to tak:
C/C++
class COSTAM
{
public:
    COSTAM();
    COSTAM( int a, int b );
    ~COSTAM();
   
private:
    int x;
    int y;
};

COSTAM::COSTAM()
    : //zauważ, że po COSTAM() mamy ":", żeby poinformować kompilator, że wystąpi lista inicjalizacyjna x( 10 )
    , //tutaj właśnie ta lista, y( 20 ) //wypisujemy nazwę zmiennej //a po niej w nawiasie wartość jaką chcemy przypisać
{ //Tu właściwe ciało konstruktora, nic nie robi.
}

COSTAM::COSTAM( int a, int b )
    : x( a )
    , //można też przypisywać wartość innych zmiennych y( b )
{ //drugi konstruktor też nic nie robi.
}

COSTAM::~COSTAM()
{
} //a destruktor już w ogóle nic nie robi ;P
P-13917
« 1 »
  Strona 1 z 1