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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
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
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
@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
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
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
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
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
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
Time (s) | Query |
---|---|
0.00010 | SET CHARSET latin2 |
0.00005 | SET NAMES latin2 |
0.00122 | 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='52.15.68.97' WHERE u.id=1 |
0.00075 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '52.15.68.97', 1732413824) |
0.00054 | SELECT * FROM punbb_online WHERE logged<1732413524 |
0.00065 | DELETE FROM punbb_online WHERE ident='206.168.34.47' |
0.00106 | SELECT topic_id FROM punbb_posts WHERE id=246429 |
0.00008 | SELECT id FROM punbb_posts WHERE topic_id=24568 ORDER BY posted |
0.00069 | 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.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00235 | 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.00089 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=24568 |
Total query time: 0.00843 s |