Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa funkcijom u klasi

[es] :: C/C++ programiranje :: Problem sa funkcijom u klasi

[ Pregleda: 2316 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

dejan85

Član broj: 155180
Poruke: 59
*.adsl-3.sezampro.yu.



Profil

icon Problem sa funkcijom u klasi30.11.2007. u 20:25 - pre 199 meseci
Ima klacu A iz nje nasledjenu klasu B a iz B nasledjene klase C i D. U A imam virtuelnu f-ju f(). Kako su f-je f() za klasu C i D skoro identicne (razlikuju se u jednom if-u) bilo bi pozeljno da tu f-ju implementiram samo za klasu B, ali ne znam kao da u njoj dobijem informaciju da li je f() pozvana od C ili D.
Neznam da li sam jasan ali to izgleda ovako
Code:

Class A{
virtual bool f();
}

Class B : public A{
bool f() {if("f() je pozvano od klase C") i=1; else i=-1;...}
}

Class C : public B{
bool f(){B::f();}
}

Class D : public B{
bool f(){B::f();}
}

Da li je moguce da uradim nesto ovako
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.bethere.co.uk.



+4 Profil

icon Re: Problem sa funkcijom u klasi30.11.2007. u 20:43 - pre 199 meseci
Mozhesh da probash sa kojekakvim rugobama tipa dynamic_cast i slichno, ali ne bih ti savetovao da to radish (tj. da uopshte razmishljas na taj nachin u C++u). Ali ako bash hocesh najjednostavnije je da prosledish josh jedan parametar f-ji f(), recimo int, pa da na osnovu njega odredish kako da se ponasha funkcija. U kom sluchaju se barem necesh vezivati za semantiku tipa "pozvano iz C klase".
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Problem sa funkcijom u klasi30.11.2007. u 21:15 - pre 199 meseci
Bila je jednom tema slicna ovoj:
http://www.elitesecurity.org/t...ledjivanje-nasledjene-funkcije

A ona varijanta sa dynamic_cast koja bi trebalo da radi, jeste vrlo ruzna kao sto rece NastyBoy i ide otprilike ovako (naravno, treba prosiriti kod):
--- H ---
Code:

class a
{
   public:
   virtual void foo();
};

class b : public a
{
};

--- CPP ---
Code:

void a::foo()
{
   if( dynamic_cast<b*>(this) != NULL )
      cout << "foo() called from b";
   else
      cout << "foo() called from a";
}

int main()
{
   a *o1 = new a;
   a *o2 = new b;

   o1->foo();
   o2->foo();

   delete o1;
   delete o2;
}
 
Odgovor na temu

dejan85

Član broj: 155180
Poruke: 59
*.adsl-1.sezampro.yu.



Profil

icon Re: Problem sa funkcijom u klasi01.12.2007. u 03:18 - pre 199 meseci
Na ovoj drugoj temi pise da je ovo resenje sa dynamic_cast testirano tj. da radi. Bukvalno sam ga copy-paste-ovao i kod mene ne radi. Program puca kad se izvrsava
Code:

 if( dynamic_cast<b*>(this) != NULL )

i iz bacuje:
Unhandled exception at 0x7c81eb33 in dynamic_cast.exe: Microsoft C++ exception: __non_rtti_object @ 0x0013fc84.
Neznam u cemu je problem

Citat:
NastyBoy: Ali ako bash hocesh najjednostavnije je da prosledish josh jedan parametar f-ji f(), recimo int, pa da na osnovu njega odredish kako da se ponasha funkcija.

Da upravo sam tako nesto i hteo, ali nemogu da prosledim jos jedan parametar f-ji f() jer je ona virtual bez parametara u klasi A, ako dodam neki u klasi B nece f() vise biti virtual, (a iz A sam vec nasledio desetak klasa nemogu u svima da menjam f-ju f())
 
Odgovor na temu

dejan85

Član broj: 155180
Poruke: 59
*.adsl-1.sezampro.yu.



Profil

icon Re: Problem sa funkcijom u klasi01.12.2007. u 03:32 - pre 199 meseci
I da, zasto ovo resenje nazivate ruznim, jel se treba izbegavati koriscenje dynamic_cast ili nesto drugo?
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Problem sa funkcijom u klasi01.12.2007. u 08:15 - pre 199 meseci
Radi kod DevC++,a radi i kod Borland C++ Buildera
Code:

#include <cstdlib>
#include <iostream>

using namespace std;

// ovo naravno treba u header, ali za ovaj primer je dovoljno da bude ovde
class a
{
   public:
   virtual void foo();
};

class b : public a
{
};

void a::foo()
{
   if( dynamic_cast<b*>(this) != NULL )
      cout << "foo() called from b\n";
   else
      cout << "foo() called from a\n";
}
int main(int argc, char *argv[])
{
    a *o1 = new a;
    a *o2 = new b;

    o1->foo();
    o2->foo();

    delete o1;
    delete o2;
   
    system("PAUSE");
    return EXIT_SUCCESS;
}

 
Odgovor na temu

dejan85

Član broj: 155180
Poruke: 59
*.adsl-1.sezampro.yu.



Profil

icon Re: Problem sa funkcijom u klasi01.12.2007. u 12:02 - pre 199 meseci
Uverio sam se da radi. Kompilirao sam ga sa g++ iz terminala i zaista radi. U C++.net puca uvek kad izvrsi if, kao sto sam gore napisao. Verovatno treba nesto da se izmeni, ko zna sta...
Videcu da resim problem sa f-jama getClassName(). Ako neko mozda zna sto nece u .net bas bi me zanimalo...
U svakom slucaju hvala...
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.fibertel.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Problem sa funkcijom u klasi02.12.2007. u 15:35 - pre 199 meseci
Najverovatnije nisi aktivirao RTTI. Bez toga dynamic_cast ne moze da radi.

Da predupredim pitanja:

http://en.wikipedia.org/wiki/RTTI

A za aktiviranje RTTI u MSVC neophodno je proslediti opciju /GR kompajleru.

I nabavi neku dobru knjigu ili tutorial za c++. Ovi nasi odgovori ti ne znace puno dok ne sednes i ne zagrejes stolicu.

BTW iskompajlirao sam kod koji je X files postavio sa mscv 8 i evo rezultata:

cl /EHsc /GR- Unit1.cpp (sa ugasenim RTTI) - program puca
cl /EHsc /GR Unit1.cpp (RTTI aktiviran) - sve radi kako treba


Tko leti vrijedi
 
Odgovor na temu

dejan85

Član broj: 155180
Poruke: 59
*.adsl-1.sezampro.yu.



Profil

icon Re: Problem sa funkcijom u klasi03.12.2007. u 03:12 - pre 199 meseci
Da, bilo je do toga. Aktiviriao sam RTTI (do sada nikad cuo) i sve radi bez problema.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Problem sa funkcijom u klasi

[ Pregleda: 2316 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.