• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sprawdzanie, jakie dziecko klasy rodzica (czyli dziedziczenie c++)

VPS Starter Arubacloud
0 głosów
555 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)
Witajcie,
otóż mam klasę, która sprawdza czy 2 obiekty się zderzyły (w konsoli). W tym celu przez referencję dostaje obiekt (void Kolizja (Klasa_Rodzic &obiekt)). Dla pojedyńczego znaku działa dobrze, ale mam także klasę Tekst (która dziedziczy z Klasa_Rodzic). Jak sprawdzić w void Kolizja, czy obiekt który funkcja dostała jest klasy Text czy innej? Próbowałem użyć enumów (enum Typ,i tam miałem 2 typy: Zwylky = 0, Tekst = 1), ale zawsze przy sprawdzaniu Typem był "Zwykly", zamiast "Tekst".

2 odpowiedzi

+3 głosów
odpowiedź 16 stycznia 2016 przez Radfler VIP (101,030 p.)
 
Najlepsza

Mógłbyś sprostować? Z Twojej wypowiedzi rozumiem tyle, że chcesz sprawdzić dynamiczny typ obiektu. Możesz to zrobić używając dynamic_cast albo typeid. Dla ułatwienia załóżmy, że mam klasę Animal oraz dziedziczące z niej Dog i Cat. Posiadam też referencję na obiekt typu Animal, o taką:

Animal& pet;

Jest to referencja do zwierzęcia. Ale jakiego? Sprawdzimy to używając dynamic_cast:

if(dynamic_cast<Cat*>(&pet)) {
  // To jest kot
} else if(dynamic_cast<Dog*>(&pet)) {
  // To jest pies
} else {
  // Coś innego
}

Albo typeid:

#include <typeinfo>
if(typeid(pet) == typeid(Cat)) {
  // To jest kot
} else if(typeid(pet) == typeid(Dog)) {
  // To jest pies
} else {
  // Coś innego
}
komentarz 16 stycznia 2016 przez C☺ndzi Stary wyjadacz (12,100 p.)
Metoda z typeid nie działa, a z dynamic_cast wywala błąd że "nie można używać "dynamic_cast" żeby konwertować z "Showable &" na "Text *". (kod opisałem bardziej pod odpowiedzią Patrycjerza)
komentarz 16 stycznia 2016 przez Radfler VIP (101,030 p.)
edycja 16 stycznia 2016 przez Radfler

Rzutujesz referencję na wskaźnik? To powinno rozwiązać sprawę:

Showable& object;

if(dynamic_cast<Text*>(&object)) { }
komentarz 16 stycznia 2016 przez Radfler VIP (101,030 p.)

Poza tym pokaż jak używasz podanych przeze mnie metod. Tu masz jeszcze jeden przykład:

#include <iostream>
#include <typeinfo>

struct Animal {
	virtual ~Animal() = default;
};

struct Dog : Animal { };

struct Cat : Animal { };

void showTypeUsingDynamicCast(Animal& animal) {

	if(dynamic_cast<Dog*>(&animal)) {
		std::cout << "Dog";
	} else if(dynamic_cast<Cat*>(&animal)) {
		std::cout << "Cat";
	} else {
		std::cout << "undefined";
	}
	std::endl(std::cout);

}

void showTypeUsingTypeid(Animal& animal) {

	if(typeid(animal) == typeid(Dog)) {
		std::cout << "Dog";
	} else if(typeid(animal) == typeid(Cat)) {
		std::cout << "Cat";
	} else {
		std::cout << "undefined";
	}
	std::endl(std::cout);

}

int main() {

	Dog dog;
	Cat cat;

	showTypeUsingDynamicCast(dog);
	showTypeUsingTypeid(cat);

	std::cin.get();

}
komentarz 17 stycznia 2016 przez C☺ndzi Stary wyjadacz (12,100 p.)
bool Showable::Colided(Showable& ColidingOBJ)
{	
	if (dynamic_cast<Text*>(&ColidingOBJ)) //jak jest & to jest blad, ze showable nie jest ttypem polimorficznym
	{
		std::cout << "DZIALA! OMG!\n";
		Sleep(100);
		return true;
		
	}
return false;
}

 

komentarz 17 stycznia 2016 przez Radfler VIP (101,030 p.)

A masz w Showable jakąś funkcję wirtualną? Rzutowanie dynamic_cast i wyrażenie typeid są tylko dla typów polimorficznych. Jeżeli nie potrzebujesz żadnych funkcji wirtualnych, to dodaj w klasie taką funkcję:

virtual ~MojaKlasa() = default;

Jest destruktor wirtualny? Jest. Klasa polimorficzna jest? Jest.

komentarz 17 stycznia 2016 przez C☺ndzi Stary wyjadacz (12,100 p.)
O kur...cze działa, dzięki!
0 głosów
odpowiedź 16 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)
Coś mi tutaj nie pasuje... Pokaż lepiej kod, bo sądzę, że nie powinno to wyglądać tak, jak piszesz.
komentarz 16 stycznia 2016 przez C☺ndzi Stary wyjadacz (12,100 p.)

Chodzi mi o coś takiego:
Mam klasę "Showable", rodzic.
Z niej dziedziczy PhysicalOBJ i Text.
Mam funkcję 

bool Colided (Showable &ColidingOBJ);

W niej chciałbym sprawdzać, czy dany obiekt koliduje z PhysicalOBJ czy Text. (jeżeli tekst, to będzie inna kolizja).

Do tej operacji potrzebuję (tak myślę) rozróżnienia, czy przesłane dziecko Showable (ColidingOBJ) jest PhysicalOBJ czy Text.

Podobne pytania

0 głosów
1 odpowiedź 184 wizyt
0 głosów
1 odpowiedź 701 wizyt
0 głosów
1 odpowiedź 199 wizyt
pytanie zadane 22 maja 2017 w C i C++ przez Sensej Użytkownik (540 p.)

92,765 zapytań

141,690 odpowiedzi

320,503 komentarzy

62,106 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...