Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-11-08 14:36:16

  Kanabinocumulus - Nowy użytkownik

Kanabinocumulus
Nowy użytkownik
Zarejestrowany: 2013-10-31

C++ , Wskaźniki na obiekty.

Dendobry :D
Mam pewno pytanie, mianowicie, jakie płyną korzyści z używania wskaźników na obiekty w c++?
Chodzi o to że możemy za pomocą adresów odwoływać się do pól z modyfikatorem Private, gdzie moglibyśmy odwołać sie tylko za pomoca procedury , zwykłe wskaźniki (na zmienne czy tablice) jakoś pojmuje , ale w obiektach nie mogę tego pojąć :D

Jak to jest panowie z tymi wskaźnikami ?

Offline

 

#2  2013-11-08 17:02:41

  averatec - Użytkownik

averatec
Użytkownik
Zarejestrowany: 2013-10-25

Re: C++ , Wskaźniki na obiekty.

do danych z modyfikatorem private czy to protected nie da sie dostac z zewnatrz obiektu bez zadnej metody typu getter/setter
nie wiem czego tutaj nie rozumiesz, tworzysz sobie instancje obiektu za pomoca operatora new co daje mozliwosc operowania na obiekcie globalnie, bo destruktor nie jest wykonywany w danym zakresie tylko wywoluje go operator delete, a wskaznik jak wskaznik, wskazuje adres do takiego obiektu w pamieci
no i sa pewne roznice w alokowaniu pamieci przy zwyklym tworzeniu obiektu i tym dynamicznym

[url]http://xion.org.pl/productions/[/url] polecam przejrzec sobie artykuly

Ostatnio edytowany przez averatec (2013-11-08 17:14:25)

Offline

 

#3  2013-11-22 17:08:09

  tricum - Użytkownik

tricum
Użytkownik
Zarejestrowany: 2013-11-02

Re: C++ , Wskaźniki na obiekty.

@averatec
owszem da się, zobacz sobie http://programmers.stackexchange.com/questions/207712/changing-value-of-a-private-member-of-a-class-in-c-without-using-member-or-fri
nie wiem czy to nie jest undefined behaviour, ale technicznie jest to możliwe.
@Kanabinocumulus
Wskaźniki na obiekty przydają się kiedy masz listę obiektów, które dziedziczą po sobie i chcesz odpalać klasy wirtualne. Zobacz sobie http://pl.wikipedia.org/wiki/Metoda_wirtualna
Dodatkowo wskaźniki przydają się w miejscach, w których nie chcesz przekazywać całych ciężkich obiektów jako argumenty funkcji, wskaźnik jest zazwyczaj mniejszy niż cały obiekt(wiem, że to można rozwiązać przez używanie referencji)

Ostatnio edytowany przez tricum (2013-11-22 23:16:00)

Offline

 

#4  2013-11-22 21:32:34

  averatec - Użytkownik

averatec
Użytkownik
Zarejestrowany: 2013-10-25

Re: C++ , Wskaźniki na obiekty.

to co podales jest niezgodne z tym jak stosuje sie wskazniki no i castowanie C to castowanie C a nie C++ (nie wiem dlaczego ludziom ciezko nauczyc sie poprawnie rzutowac typy w C++)

Ostatnio edytowany przez averatec (2013-11-22 21:34:08)

Offline

 

#5  2013-11-22 23:06:56

  tricum - Użytkownik

tricum
Użytkownik
Zarejestrowany: 2013-11-02

Re: C++ , Wskaźniki na obiekty.

Nie pisałem, że jest zgodne z czymkolwiek, chociaż standard nic nie pisze na ten temat (wskaźniki są opisane w części 8.3.1
standardu http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf ). Napisałem jedynie, że takie coś jest technicznie możliwe. Mam nadzieję, że ten kod spełni Twoje wymagania co do poprawności rzutowania http://ideone.com/hceuZT (tak na marginesie poprawiona wersja też działa)

Edit:
celowo zmieniłem typ zmiennej z int na char - teraz użycie reinterpret cast jest w pełni zdefiniowane

Ostatnio edytowany przez tricum (2013-11-23 00:30:03)

Offline

 

#6  2013-11-23 19:18:42

  averatec - Użytkownik

averatec
Użytkownik
Zarejestrowany: 2013-10-25

Re: C++ , Wskaźniki na obiekty.

ok, ale co w wypadku gdy rozbudowujesz klase, wiadomo ze takie stosowanie wskaznikow nie jest najbezpieczniejsza metoda chociaz i tak mozna to robic, bo tak naprawde czym jest wskaznik? adresem, wiec dodajac do niego odpowiedni offset mozna dostac sie do kazdego pola obiektu

@edit
modyfikatory dostepu sa tak naprawde informacja dla kompilatora, wiec nie ma co sie dziwic ze mozna dostac sie w ten sposob do private czy protected pola z poza instancji obiektu

Ostatnio edytowany przez averatec (2013-11-23 19:25:31)

Offline

 

#7  2013-11-24 18:49:20

  tricum - Użytkownik

tricum
Użytkownik
Zarejestrowany: 2013-11-02

Re: C++ , Wskaźniki na obiekty.

Słuchaj nie chodzi mi o to, żeby tego używać. Bo takie zastosowanie wskaźnika może być zgodne ze standardem, ale na pewno nie jest zgodne z założeniami programowania obiektowego. Jedyne o co mi chodziło to to, żeby pokazać, że dostęp do pola private jest technicznie możliwy

Offline

 

#8  2013-11-24 20:00:48

  averatec - Użytkownik

averatec
Użytkownik
Zarejestrowany: 2013-10-25

Re: C++ , Wskaźniki na obiekty.

ok, nie chcialem tutaj niczego kwestionowac, tylko dodalem ze modyfikatory dostepu sa informacja dla kompilatora, czyli sa sprawdzane podczasz kompilacji a nie runtime jak np w javie, a takie zastosowanie wskaznika powinno chociaz generowac warning

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)

[ Generated in 0.010 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00010 SET CHARSET latin2
0.00006 SET NAMES latin2
0.00107 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.227.114.218' WHERE u.id=1
0.00229 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.227.114.218', 1732735019)
0.00022 SELECT * FROM punbb_online WHERE logged<1732734719
0.00087 SELECT topic_id FROM punbb_posts WHERE id=245315
0.00160 SELECT id FROM punbb_posts WHERE topic_id=24568 ORDER BY posted
0.00062 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=24568 AND t.moved_to IS NULL
0.00004 SELECT search_for, replace_with FROM punbb_censoring
0.00093 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=24568 ORDER BY p.id LIMIT 0,25
0.00075 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=24568
Total query time: 0.00855 s