Warsztat - Programowanie gier

Wrzesień 03, 2010, 03:18:50 *
Witamy, Gość. Zaloguj się, lub zarejestruj proszę.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Warsztat, Regulamin forum, #warsztat, Wiki, FAQ, NoPaste, Mapa
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  
Strony: 1 [2] 3
  Drukuj  
Autor Wątek: Wywołanie metody poprzez wskaźnik - dziwny błąd  (Przeczytany 1688 razy)
Kos
Member2000
*******

wiadomości: 3487



Zobacz profil
« Odpowiedz #15 : Sierpień 11, 2009, 10:43:10 »

Czemu mam każdorazowo pod chrome warna bezpieczeństwa gdy wchodzę na ten (i tylko ten) temat? Shocked
Zapisane

Eclipse!
Esidar
SuperHero Member
******

wiadomości: 1360


Zobacz profil
« Odpowiedz #16 : Sierpień 11, 2009, 11:08:56 »

A potem się zastanawiaj, które konkretnie metody w tej sześćdziesiątej siódmej klasie pochodnej są przesłonięte, które są nowo wprowadzonymi metodami wirtualnymi, a które nic z tych dwóch... Oczywiście musisz sprawdzić wszystkie sześćdziesiąt sześć klas bazowych. Ach, jak temu C++ brakuje choćby takiego głupiego override.

Ja się nie muszę zastanawiać. Jeśli w klasie jest "SetPosition" to mnie nie interesuje czy jest wirtualna czy nie i czy ew. wywołuje metodę z klasy bazowej. Jeśli to jest mój kod, to wiem jak to działa, jeśli nie mój kod, to nie obchodzi mnie implementacja.

Jeśli chcesz mieć override to sobie zrób "#define override" i wszędzie wklejaj.
Zapisane
Liosan
SuperHero Member
******

wiadomości: 1506



Zobacz profil
« Odpowiedz #17 : Sierpień 11, 2009, 12:06:31 »

...Jeśli to jest mój kod, to wiem jak to działa...
Też miałem takie założenie 10 lat temu. Parę lat programowania i myślę inaczej... Smiley Ale Ty przecież też nie od wczoraj piszesz... więc pewnie każdemu co innego przeszkadza. Mi np. przeszkadza przesłanianie Smiley

Liosan
Zapisane

Cytuj z: toxic
w ich zylach plynie praslowianska krew - oni musza wiedziec jak sie robi software
Demo WG RC2!
Aithne
Hero Member
*****

wiadomości: 648


Zobacz profil
« Odpowiedz #18 : Sierpień 11, 2009, 15:43:21 »

ShadowDancer, jak ci tak bardzo zależy, to zamień to sześćdziesiąt siedem na piętnaście i sześćdziesiąt sześć na czternaście. Wiele to nie zmienia, roboty potem i tak trochę jest.
Zapisane
Nargil
Sr. Member
****

wiadomości: 264



Zobacz profil WWW
« Odpowiedz #19 : Sierpień 11, 2009, 17:28:17 »

Ok faktycznie przyznaję się do błędu ;/ Moim zdaniem to jednak trochę nielogiczne. No cóż

Kod:
#include <iostream>

class base
{
public:
virtual void whoAreYou()
{
std::cout << "base" << std::endl;
}
};

class ext1 : public base
{
public:
void whoAreYou()
{
std::cout << "ext1" << std::endl;
}
};

class ext2 : public ext1
{
public:
void whoAreYou()
{
std::cout << "ext2" << std::endl;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
base *b = new base();
ext1 *e1 = new ext1();
ext2 *e2 = new ext2();

b->whoAreYou();
static_cast<base*>(e1)->whoAreYou();
//tu słusznie spodziewałem się "ext2"
static_cast<base*>(e2)->whoAreYou();

//tu niesłusznie spodziewałem się "ext1"
static_cast<ext1*>(e2)->whoAreYou();

system("pause");
}
tak wygląda output
Kod:
base
ext1
ext2
ext2
Zapisane

yarpen
SuperHero Member
******

wiadomości: 1445


Zobacz profil WWW
« Odpowiedz #20 : Sierpień 11, 2009, 18:40:48 »

Kwestia przyzwyczajenia. Dla mnie nielogicznie jest to rozwiazane w C#.
Zapisane
Kot
Sr. Member
****

wiadomości: 303



Zobacz profil
« Odpowiedz #21 : Październik 13, 2009, 22:36:56 »

Cytuj z: Esidar
Jeśli chcesz mieć override to sobie zrób "#define override" i wszędzie wklejaj.
Tak jak opisałem w komentarzu na blogu Xiona (http://xion.org.pl/2009/10/13/override-w-c-i-nie-tylko/#comment-6550), w MSVC jest keyword override Smiley
http://msdn.microsoft.com/en-us/library/41w3sh1c.aspx
Zapisane
ConayR
SuperHero Member
******

wiadomości: 1481


Cheers!


Zobacz profil
« Odpowiedz #22 : Październik 13, 2009, 23:50:21 »

Cytuj z: Esidar
Jeśli chcesz mieć override to sobie zrób "#define override" i wszędzie wklejaj.
Tak jak opisałem w komentarzu na blogu Xiona (http://xion.org.pl/2009/10/13/override-w-c-i-nie-tylko/#comment-6550), w MSVC jest keyword override Smiley
http://msdn.microsoft.com/en-us/library/41w3sh1c.aspx
Nie w MSVC a w _managed_ C++. To poważna różnica, bo w ten sposób można by się upierać, że C++ to język z grabarzem pamięci.
Zapisane

On the Internet, nobody knows you're a dog
bies
Sr. Member
****

wiadomości: 390


Zobacz profil
« Odpowiedz #23 : Październik 14, 2009, 00:36:48 »

(...) w ten sposób można by się upierać, że C++ to język z grabarzem pamięci.
Grabarzem? Chodzi Ci od odśmiecacz? Toż w C++ znam przynajmniej 4, zarówno precyzyjne jak i konserwatywne (Śmieciuch, SGCL, Boehm i jakiś czwarty znaleziony na sf.net). Jeszcze nie widziałem kompaktującego ale wydaję mi się, że przy pewnych założeniach też da się napisać.
Zapisane
ConayR
SuperHero Member
******

wiadomości: 1481


Cheers!


Zobacz profil
« Odpowiedz #24 : Październik 14, 2009, 01:14:02 »

(...) w ten sposób można by się upierać, że C++ to język z grabarzem pamięci.
Grabarzem? Chodzi Ci od odśmiecacz? Toż w C++ znam przynajmniej 4, zarówno precyzyjne jak i konserwatywne (Śmieciuch, SGCL, Boehm i jakiś czwarty znaleziony na sf.net). Jeszcze nie widziałem kompaktującego ale wydaję mi się, że przy pewnych założeniach też da się napisać.
Hmm? Ja nie mówię, że nie można - piszę jedynie, że jest różnica między "gołym" C++ a C++/CLR w środowisku MSVC. Dyskusja toczyła się o override w C++ "gołym" (nie napiszę zgodnym ze standardem, bo mi jakiś bojownik GCC kwiatki w ogrodzie podepcze) i stwierdzenie, że MSVC ma override mija się IMO z prawdą.
Zapisane

On the Internet, nobody knows you're a dog
bies
Sr. Member
****

wiadomości: 390


Zobacz profil
« Odpowiedz #25 : Październik 14, 2009, 01:46:07 »

(...) stwierdzenie, że MSVC ma override mija się IMO z prawdą.
Ale na override to ja się nie znam (nie używam C++/CLI). Pisałem tylko, że analogia z GC była do bani.
Zapisane
ConayR
SuperHero Member
******

wiadomości: 1481


Cheers!


Zobacz profil
« Odpowiedz #26 : Październik 14, 2009, 01:55:53 »

Czy GC jest wbudowanym ficzerem C++? Nie. Więc analogia poprawna - C++ (bez CLR) nie ma ani grabarza, ani override. I grabarza i override* zaimplementować można, ale nie znaczy to, że jest na dzień dobry dostępny.

Pomijam już logikę "porównałeś A do B; na A się nie znam, ale porównanie do B do bani"...

* metodą opisaną wcześniej w wątku - #define override
Zapisane

On the Internet, nobody knows you're a dog
bies
Sr. Member
****

wiadomości: 390


Zobacz profil
« Odpowiedz #27 : Październik 14, 2009, 01:58:54 »

C++ (bez CLR) nie ma ani grabarza, ani override. I grabarza i override* zaimplementować można, ale nie znaczy to, że jest na dzień dobry dostępny.

* metodą opisaną wcześniej w wątku - #define override [podkreślenia moje]
A myślałem, że mówisz poważnie...
Zapisane
ConayR
SuperHero Member
******

wiadomości: 1481


Cheers!


Zobacz profil
« Odpowiedz #28 : Październik 14, 2009, 02:06:11 »

C++ (bez CLR) nie ma ani grabarza, ani override. I grabarza i override* zaimplementować można, ale nie znaczy to, że jest na dzień dobry dostępny.

* metodą opisaną wcześniej w wątku - #define override [podkreślenia moje]
A myślałem, że mówisz poważnie...
Rozumiem, że to komentarz poparty wiedzą na temat działania override w C++/CLR?
Zapisane

On the Internet, nobody knows you're a dog
siso
Sr. Member
****

wiadomości: 345


Zobacz profil
« Odpowiedz #29 : Październik 14, 2009, 02:18:46 »

C++ (bez CLR) nie ma ani grabarza, ani override. I grabarza i override* zaimplementować można, ale nie znaczy to, że jest na dzień dobry dostępny.

* metodą opisaną wcześniej w wątku - #define override [podkreślenia moje]
A myślałem, że mówisz poważnie...
Słuszna uwaga, bies.
Nie wystarczy napisać override. To musi być sprawdzenie, inaczej nie ma sensu. W Javie wykłada kompilację.
Zapisane

Otwarty GL / Bezpośredni X
Strony: 1 [2] 3
  Drukuj  
 
Skocz do:  

Hosting: Polska Strefa - Ogłoszenia
Powered by SMF 1.1.7 | SMF © 2006, Simple Machines LLC