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

porównanie typów dwóch zmiennych c++

Object Storage Arubacloud
0 głosów
1,885 wizyt
pytanie zadane 18 października 2016 w C i C++ przez pewien_programista Obywatel (1,070 p.)
Witam!

Mam problem takiej natury: Mam klasę Menu i dziedziczącą z niej Submenu. stworzyłem tablicę (a raczej vector, ale to chyba niezbyt istotne) typu Menu i wrzuciłem tam zarówno obiekty klasy Menu jak i Submenu, do tego momentu idzie dobrze... Ale potem pojawia się problem... Mam funkcję która jako argument przyjmuje obiekt klasy Submenu, a one są wymieszane z elementami klasy Menu. Czy istnieje funkcja, która pozwoliłaby sprawdzić czy obiekt jest klasy Menu czy Submenu aby zwykłym if'em zdecydować czy wywołać funkcję? mam na myśli coś w stylu if(obiekty[x].klasa() == Submenu) funkcja(obiekty[x]). Czy w ogóle ma to prawo działać? Z góry dziękuję za odpowiedź.

5 odpowiedzi

+1 głos
odpowiedź 18 października 2016 przez L33TT12 Gaduła (3,950 p.)
Wystarczy użyć funkcji wirtualnej
komentarz 18 października 2016 przez pewien_programista Obywatel (1,070 p.)
Nie do końca rozumiem jak miałoby to działać... problem w tym że klasa Submenu jest rozszerzona o kilka pól, z których korzysta moja funkcja(nie będąca częścią żadnej z tych klas)
komentarz 18 października 2016 przez L33TT12 Gaduła (3,950 p.)

Musisz dodać przed nazwą funkcji "virtual", natomiast sam vector musi być wskaźnikami na obiekty, po czym wywołają się odpowiednie metody, niezależnie czy pochodna ma jakieś dodatkowe zmienne;
Coś takiego typu:

class Bazowa
{
	void fun() { std::cout << "bazowa\n"; }
public:
	virtual void funkcja() { fun(); }
};


class Pochodna :public Bazowa
{
	void x() { std::cout << "dodatkowa z pochodnej\n"; }
	void fun() { std::cout << "pochodna\n"; }
public:
	virtual void funkcja() { fun();x(); }
};

int main()
{
	std::vector<Bazowa*> vec;
	vec.push_back(new Bazowa);
	vec.push_back(new Pochodna);
	vec.push_back(new Pochodna);
	vec.push_back(new Bazowa);
	for (unsigned int i = 0;i < vec.size();++i)
		vec[i]->funkcja();
}

 

komentarz 18 października 2016 przez pewien_programista Obywatel (1,070 p.)
jak już napisałem nic nie da mi użycie funkcji wirtualnej, ponieważ funkcja którą chcę wywołać NIE należy ani do klasy bazowej ani do pochodnej, a jedynie przyjmuje jako argument jedną z nich...
komentarz 18 października 2016 przez L33TT12 Gaduła (3,950 p.)

 Czy istnieje funkcja, która pozwoliłaby sprawdzić czy obiekt jest klasy Menu czy Submenu

 W takim razie (chyba) jedyną opcją jest użycie operatora dynamic_cast.

	Bazowa * a = new Bazowa;
	if (a == dynamic_cast<Pochodna*>(a))
		std::cout << "a zawiera wskaznik na pochodna\n";
	else
		std::cout << "a zawiera wskaznik na bazowa\n";

 

+1 głos
odpowiedź 18 października 2016 przez JAKUBW Nałogowiec (33,470 p.)
Zrób rzutowanie za pomocą dynamic cast i sprawdź czy nie wyszedł null.
0 głosów
odpowiedź 18 października 2016 przez Avernis Nałogowiec (27,400 p.)

Najprościej:

#include <iostream>

class X
{
    public:
    int x = 0;
};

class Y : X
{
    public:
    int x = 1;
};

int main()
{
    Y x;
    std::cout << x.x;

  return(0);
}

 

komentarz 18 października 2016 przez pewien_programista Obywatel (1,070 p.)
Niestety nie działa :( wyskakuje że nie można przekonwertować MENU do SUBMENU...
komentarz 18 października 2016 przez Avernis Nałogowiec (27,400 p.)
To nie wiem :/ mi wszystko działa, po prosty sprawdzam czy x jest równe 0, czy 1
komentarz 18 października 2016 przez pewien_programista Obywatel (1,070 p.)
zgadzam się, jeśli chodzi o samo porównanie to wszystko ok, ale błąd polega na tym, że kiedy próbuję "wyciągnąć" element z tablicy Menu to kompilator zakłada (po części jest to logiczne) że będę działał na elemencie klasy Menu, a funkcja przyjmuje nie Menu a Submenu...
1
komentarz 18 października 2016 przez Patrycjerz Mędrzec (192,320 p.)

Avernis, a słyszałeś o operatorze typeid? Po co odwalać fuszerkę, jak można to zrobić w klarowny i przejrzysty sposób?

komentarz 18 października 2016 przez Avernis Nałogowiec (27,400 p.)
Nie, nie słyszałem. Nigdy się w dziedziczenie nie bawiłem, ale wpadłem na taki powyższy sposób
0 głosów
odpowiedź 18 października 2016 przez Szahid Pasjonat (20,930 p.)
Na pewno istnieje jakiś elegantszy mechanizm ale możesz dodać do klasy dodatkowy argument w postaci bool który będzie przyjmował odpowiednią wartość w zależności od tego jaki obiekt jest utworzony . Funkcja będzie sprawdzała ifem z jakim obiektem ma do czynienia. Prymitywne ale cholernie skuteczne
0 głosów
odpowiedź 26 października 2016 przez egoon Obywatel (1,360 p.)

Kłaniam,

może już po sprawie i sam poradziłeś, może nie o to chodzi - ale mam takie coś:

if(typeid(obiekt).name() == Submenu)
{...}

Za 'obiekt' wstaw swój rzecz jasna.

A przy okazji, to pierwszy mój wpis, więc wypada się przywitać. No więc witam się i w pas gnęblush

 

Podobne pytania

0 głosów
2 odpowiedzi 253 wizyt
pytanie zadane 21 czerwca 2016 w Java przez windsmasher Nowicjusz (170 p.)
0 głosów
1 odpowiedź 448 wizyt
pytanie zadane 5 września 2018 w SQL, bazy danych przez Mark Bogart Początkujący (400 p.)

92,655 zapytań

141,546 odpowiedzi

319,984 komentarzy

62,024 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...