Avatar billede hurra Novice
12. juni 2009 - 14:07 Der er 5 kommentarer og
1 løsning

Multipel nedarvning og dynamisk anden base

Jeg har et arkitektonisk problem i mit program. Jeg har nogle måle instrument typer, e.g. en analyser og en generator. Så har nogle konkrete måleinstrumenter, nogle analysere, nogle er generatore og helt treide er både analysere og generatore.

Påp analyser og generator niveauet har jeg også filtre, og et måleinstrument der både indeholder en generator og en analyser må ikke kunne forveksles med et filter.

Når man så i koden har en opgave der skal løses med et måle instrument, e.g. en analyser, skal brugeren kunne vælge om han vil bruge en analyser eller et af de sammensatte instrumenter. Problemet er så, at det kan også være at man har brug for en generator, og til det skal man også kunne vælge et af de sammen satte.

et kode exempel:

class instrument;
class generator : public virtual instrument;
class analyser : public virtual instrument;
class sammensat : public virtual generator, virtual analyser;

class test
{
  public:
    analyser *a;
    generator *b;

    SetSammenSat(sammensat *x)
    {
      a = x; // Kan klart nok ikke lade sig gøre
      b = x;
    }
};

Hvordan løser jeg problemet smartest? Mit eneste forslag er at lade mit sammensatte instrument have referenser til de enkelte dele det indeholder, og så:
    SetSammenSat(sammensat *x)
    {
      a = x->analyser;
      b = x->generator;
    }
Men det giver mig så problemet, at sammensat ikke har nedarvet fra analyser og generator, og der kan være 1000 forskellige sammensatte instrumenter, e.g. nogle kun goså indeholde filtre, osv.
Avatar billede karas Nybegynder
12. juni 2009 - 14:12 #1
Du benytter dynamic_cast operatoren:

void test::SetSammenSat(sammensat* x)
{
a = dynamic_cast<analyser*>(x);
b = dynamic_cast<generator*>(x);
}

Hvis 'x' ikke er en analyser / generator vil den pågælende cast returnere en null-pointer.
Avatar billede karas Nybegynder
12. juni 2009 - 14:14 #2
ups, byttede lige om på 'sammensat' og 'instrument'.
Avatar billede karas Nybegynder
12. juni 2009 - 14:20 #3
Er det virkeligt nødvendigt nedarve virtuelt fra 'generator' og 'analyzer'?

class sammensat : public generator, public analyser;
Avatar billede karas Nybegynder
12. juni 2009 - 14:28 #4
Grunden til at "det ikke virker" er fordi 'analyzer' nedarves 'private' (så kan den ikke tilgåes fra 'test' klassen. Er det ikke en typo? Skulle den ikke være nedarvet public lige sem jeg skrev i svar #3?
Avatar billede hurra Novice
12. juni 2009 - 14:44 #5
HA, DET VIRKER :)

Super, tak for hjælpen. Kom med et svar.

Og ja til #3, da der kan recikere at der kommer en ny type sammensatte instrumenter, der er sammensat af bl.a. et sammensat instrument og noget andet. (navnene her er ikke de endelige).
Avatar billede karas Nybegynder
12. juni 2009 - 14:46 #6
glad jeg kunne hjælpe
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester