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

[Teoria] Przekazywanie informacji obiektowi podrzędnemu w klasie.

Ostatnio zmodyfikowano 2013-01-02 19:00
Autor Wiadomość
unimator
Temat założony przez niniejszego użytkownika
[Teoria] Przekazywanie informacji obiektowi podrzędnemu w klasie.
» 2013-01-02 16:14:07
Witam!

Ostatnio postanowiłem sobie przepisać pewną grę, którą to kiedyś napisałem, i której to kod wyszedł... ala spaghetti :D. Pytanie jednak nie odnosi się do samej gry tylko do sposobu w jaki mam zrealizować pewną czynność.

Mianowicie, mam główną klasę gry, nazywa się CGame. Wewnątrz niej mam obiekty klas takich jak CMenu, Clevel, CGraphicSystem itd. Nazwę je obiektami podrzędnymi. I tutaj pojawia się "problem". W jaki sposób do tych obiektów podrzędnych przekazać np. wskaźniki do innych obiektów równoległych czy jakieś informację by było to w miarę poprawne. Innymi słowy, czy mogę w konstruktorze obiektów podrzędnych po prostu przekazać obiekt nadrzędny (CGame) i wewnątrz funkcji pobrać potrzebne informację, czy może poprawniej byłoby przekazywać po kolei wskaźniki, zmienne itd. w parametrach konstruktora czy w innej funkcji tego typu?
P-72715
jsc
» 2013-01-02 16:17:06
Obiekt nadrzędny można przekazać dzięki słowu kluczowemu this, które używa się zamiast nazwy obiektu.
P-72716
kubawal
» 2013-01-02 16:20:15
C/C++
class CGame; // deklaracja

class CMenu
{
    //...
    CGame * parent;
public:
    //...
    Cmenu( CGame * p, /*...*/ )
        : parent( p )
    { /*...*/ }
    //...
};
//resztę robisz podobnie

class CGame
{
    //...
    CMenu menu;
    CLevel level;
    // itd.
public:
    CGame( /*...*/ )
        : menu( this )
        , level( this )
        , /*itd.*/
    { }
    //...
};
P-72717
unimator
Temat założony przez niniejszego użytkownika
» 2013-01-02 18:55:53
Nie czaicie :D Ja wiem jak to zrobić. Mi chodzi o poprawność takiego działania i kwestie tego, która metoda, A czy B, które przedstawię poniżej, jest ewentualnie lepsza ze względu na ponowne użycie kodu.

Przekazanie całego obiektu niejako uniemożliwia mi użycie klasy w innym projekcie bo uzależniłbym ją od konkretnego obiektu nadrzędnego danej klasy (w tym wypadku CMain). Byłaby to jednak łatwiejsza i prostsza metoda.
Natomiast jeśli przekażę tylko pola klasy nadrzędnej to klasa stania się praktycznie niezależna. Problemem będzie jednak ewentualna komunikacja z klasą nadrzędną bo nie będzie miała praktycznie jak tego zrobić (wtedy komunikacją w obie strony musiałaby się zająć klasa właśnie ta klasa nadrzędna).

I mi chodzi o to, która z tych dwóch metod jest lepsza.

C/C++
class CMain; //klasa główna
class CMarginal; //klasa pobozcna


//------KLASA NADRZEDNA
class CMain
{
private:
    CMarginal * Marginal;
   
public:
    CMain();
};


//------KLASA PODRZEDNA
class CMarginal
{
private:
    CMain * Main;
   
public:
    CMarginal( CMain * );
    CMarginal( typeA, typeB, typeC...);
};

//Resztę składowych pomijam, ale zależnie od metody jakieś tam będą :P

//###########################################################
//###########################################################

//Metoda A: Przekazywanie całego obiektu nadrzędnego do klasy podrzędnej

CMarginal::CMarginal( CMain * pMain )
{
    //tutaj pobieranie jakichś informacji
}

//Metoda B: Przekazywanie jedynie tych argumentów, które klasa podrzędna potzebuje
CMarginal::CMarginal( typeA argA, typeB argB, typeC argC...)
{
    //to samo co w konstruktorze wyżej
}

P-72749
jsc
» 2013-01-02 19:00:39
Sądzę, że pierwsza, bo zmieniasz tylko nazwę jednego obiektu, a nie całe interfejsy.
P-72751
« 1 »
  Strona 1 z 1