kilka pytań o wskaźniki

0
  1. W jaki sposób mogę z wnętrza metody uzyskać dostęp do obiektu, na rzecz którego została ona wywołana? (czy jedynym sposobem (najlepszym?) jest przekazywanie obiektu (lub jego wskaźnika) jako parametr ??).
  2. Jak odrębne obiekty w programie mogą ?wiedzieć? o sobie nawzajem i przekazywać między sobą informacje?
  3. Czego lepiej używać (i w jakioch sytuacjach) ... wskaźnika na obiekt czy zmiennej obiektowej.

PS. eventualne kody źródłowe piszcie w C++ (Visual), w ostateczności w Pascalu (Delphi)

0

<font color="green">1. W jaki sposób mogę z wnętrza metody uzyskać dostęp do obiektu, na rzecz którego została ona wywołana? (czy jedynym sposobem (najlepszym?) jest
przekazywanie obiektu (lub jego wskaźnika) jako parametr ??).</span>

Dokładnie - jest to najlepsza metoda, jeśli nie jedyna - Sender: TObject.

<font color="green">2. Jak odrębne obiekty w programie mogą ?wiedzieć? o sobie nawzajem i przekazywać między sobą informacje?</span>

Przekazując parametry - hmm albo poprzez zmienne? .. możesz bardziej wyprostować o co chodzi.. ?

<font color="green">3. Czego lepiej używać (i w jakioch sytuacjach) ... wskaźnika na obiekt czy zmiennej obiektowej.</span>

Nie odpowiem na to pytanie, bo to już zależy od konkretnej sytuacji, chociaż nie spotkałem się jeszcze ze wskaźnikiem na obiekt - nie jest chyba popularnie używany..

0

PS. eventualne kody źródłowe piszcie w C++ (Visual), w ostateczności w Pascalu (Delphi)

To jest dział Delphi wiec to co napsialas(łeś) jest jakby nie na miejscu.

  1. w metodzie kazdej klasy masz zmienna self ktora jest referencja do obiektu z jakiego pochodzi.
  2. To zalezy o co pytasz , bo to dosc ogolne pytanie.
  3. W delphi zmienne obiektowe (typu class) sa zmiennymi referencyjnymi wiec nie bardzo ma sens uzywanie wskaznikow. To znaczy jelsi masz
    var x:Tclasa; // gdzie Tclasa jest typu class

to pod x masz tylko adres a nie jak w c++ gdzie sa obiekty statyczne i pod zmienna obiektowa kryje sie caly obiekt (z polami i adresami);
To tak w skrocie.

//dopisane: Detox mnie uprzedził:)))

0

Hello again!

sprostowanie dla .. w pytaniu 2

(podam na przykładzie w C++ bo trochę mi łatwiej)

mam plik mainfile.cpp, a w nim takie deklaracje
--------cut---------
CGracz* gracz = new CGracz;
CMonster* mon = new CMonster;
--------cut---------

i teraz w metodzie DoAI() obiektu mon chcę mieć informację o zmiennej gracz.pozycja //pozycja to obiekt klasy CVector3D, ale to teraz mało istotne

teraz napisze to metodą najprostszą (łopatą do głowy). Chodzi oto, że chce wymieniać informacje między klasami, które zadeklarowane są na tym samym szczeblu programu (np. w jednej klasie (np. silniku))

-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-
adnotacja dla .. do pytania 3

rzeczywiście w Delphi jest to rzadkość ale w C++ zdarzają się deklaracje
--------cut---------
CGracz* gracz = new CGracz;
CGracz gracz;
--------cut---------

i chodzi oto czego lepiej jest używać...

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
odpowiedź dla KIDo odnośnie odpowiedzi na pytanko 2

najwyraźniej nie zrozumiałeś, bo twoja odpowiedź się nie klei nawet przy użyciu Poxipolu :D

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
odpowiedź dla KIDo odnośnie odpowiedzi na pytanko 3

dlaczego wskaźnik będzie zajmował mniej pamięci skoro i tak zostanie ona przydzielona dla obiektu ??

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
sprecyzowanie dla ogółu do pytanka 1

zapomniałem wspomnieć, że VCL nie wchodzi w rachubę, gdyż pytam pod kątem OpenGL'a (piszę w Visualu)

0

nie spotkałem się jeszcze ze wskaźnikiem na obiekt - nie jest chyba popularnie używany..

Jak przekazujesz w funkcji jakiś obiekt, to tak naprawdę nie przekazujesz obiektu, ale wskaźnik do niego. Ale tym się zajmuje delphi. Czyli nie ma znaczenia, czy przekazesz sam obiekt, czy wskaźnik do niego (w sposób jawny), bo i tak na jedno wyjdzie... :)

a jak to jest w C++

Myślę, że tak samo. Bo raczej sie nie powinno przekazywac funkcji argumentow wiekszych, niz kilka bajtow.

0

nie spotkałem się jeszcze ze wskaźnikiem na obiekt - nie jest chyba popularnie używany..

Jak przekazujesz w funkcji jakiś obiekt, to tak naprawdę nie przekazujesz obiektu, ale wskaźnik do niego. Ale tym się zajmuje delphi. Czyli nie ma znaczenia, czy przekazesz sam obiekt, czy wskaźnik do niego (w sposób jawny), bo i tak na jedno wyjdzie... :)

a jak to jest w C++ ??

0

Odpowiedź do pytania 2:

W Delphi w tym celu są odowiednie kwalifikatory metod, tak dobrane aby był możliwy wybór, gdzie dana metoda ma być widoczna. I tak:

type 
  TMojaKlasa = class(TKlasaMacierzysta)
   
  private
    procedure Oblicz' // metoda widoczna tylko w module, w którym znajduje się  TMojaKlasa

  public
    procedure Podziel; // metoda widoczna przez wszystkie klasy

  protected
    procedure Odejmij; // metoda widoczna w TMojaKlasa i klasach pochodnych do niej

  published
    procedure Dodaj; // jak public, z informacją RTTI
  

A jeśli chodzi o przekazywanie do procedur / funkcji klas.. zauważ, że gdy przekazujesz jakiś obiekt robisz tak:

procedure CosTam(AComponent: TComponent);

Gdyby za AComponent nie krył się wskaźnik, musiałbyś przekazywać przez klasyczną referencję:

procedure CosTam(var AComponent: TComponent);

Ale nie jest to konieczne - Delphi automatycznie to robi.

0

<quote>Odpowiedź do pytania 2:

W Delphi w tym celu są odowiednie kwalifikatory metod, tak dobrane aby był możliwy wybór, gdzie dana metoda ma być widoczna. I tak:
...
<quote>

zgadzam się z Tobą, ale mi chodzi oto, że dwie klasy są na tym samym "poziomie", tzn. są równoległe (pierwsza nie jest deklarowana w drugiej, ani druga w pierwszej), czyli są zadeklarowane w jednym pliku np.

// plik engine.cpp
#include engine.h

CKlasa1 obiekt1;
CKlasa2 obiekt2;

i chce mieć dostępne informacje o obiekcie obiekt1 w obiekt2

0

Hmm - właśnie to napisałem - po to jest kwalifikator public (lub published), niestety nie rozumie analogii z C++, bo nie znam tego języka.

0

ja juz kompletnie nie wiem o co kamon :P ale moze sie przyda:

class jakas_klasa {
  int x;
public:
  int zmienna;
  int rybka(int cos){return cos+2;}
  jakas_klasa(void) {x=66; zmienna=67;}
};

class druga {
  int y;
public:
  int x;
  int a(void){return y;}
  druga(void) {y=4; x=5;}
};

class git : public druga { //klasa git dziedziczy po druga publicznie
//wiec ma dostep do jej publicznych składowych tak jak by były publiczne
//natomiast do zmiennych prywatnych musi sie odnosic za pomoca funkcji
//klasy z ktorej dziedziczy
  int y;
public:
  int x;
  int fun(void)
  { y=druga::a(); // druga:: wskazuje na skladnik klasy dziedziczonej
    x=y+ druga::x;
    return x+y;
  }
};

i teraz:

jakas_klasa jk;
jakas_klasa *wsk_jk;
jakas_klasa &aaa = jk;
druga d2;
druga *wsk_d2=&d2;
//---------------
jk.zmienna=d2.x;  //za pomoca zmiennej

wsk_jk = & jk;
wsk_jk->zmienna = d2.a(); //za pomoca wskaźnika
wsk_jk->rybka(wsk_d2->a());

aaa.zmienna=wsk_d2->x; //za pomocą referencji

jesli cos niepasuje, albo cos niejasne to napiszcie, bo ja w ogóle juz nie wiem :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1