Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Klassen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.08.2003, 19:02 Uhr
~dummy
Gast


Hallo.

Ich habe hier eine eher grundlegende Frage zu Klassen in C++.

Ich schreibe z.Zt ein Programm, das ich mal in C geschrieben habe, in C++ neu. Es greif auf einen Datenträger zu und etapliert dort ein eigenes Dateisys.
(Sinn und Zweck eher zweifelhaft :rolleyes

Nun möchte ich den Eigentlichen Zugriff auf das Laufwerk so realisieren:
Es gibt eine Klasse für das Dateisystem. Diese greift auf eine Klasse, die den Zugriff auf das Laufwerk handelt, zu.

Mein Problem ist nur, das ich mehrer Laufwerk, die anders angesprochen werden, unterstützen will.
Für jeden Laufwerkstyp möchte ich eine eigene Klasse schreiben. Diese Klassen sollen alle ein standatisiertes Interface besitzen (meiner Meinung nach wäre es angebracht eine Quell-Klasse(im Bsp "interface_dummy"), die dann an alle Laufwerks-Zugriffs-Klassen(im Bsp "aa", "bb") vererbt wird, zu schreiben.).

Nun möchte ich irgendwo im Programm (im Bsp in main) die Klasse für das Dateisystem (im Bsp "print") laden und dann - je nach zugeordneten Laufwerk - dieser noch eine Laufwerks-Klasse (im Bsp "aa", "bb") zuordnenen.


C++:
#include <iostream>
using namespace std;

class interface_dummy        /* Das ist die Vorgabe für das Interface */
{
    public:
    int getnum();
};

class aa : public interface_dummy    /* Eine mögliche Klasse zum Zuriff auf das Laufwerk */
{
    public:
    int getnum();
};

class bb : public interface_dummy    /* Eine andere mögliche Klasse zum Zuriff auf das Laufwerk */
{
    public:
    int getnum();
};    

class print                            /* Diese Klasse stellt das Dateisystem da */
{
    public:
    interface_dummy my_cls;
    void print_num();
};

int interface_dummy::getnum ()
{
    return 0;
}

int aa::getnum()
{
    return 1;
}

int bb::getnum()
{
    return 2;
}

void print::print_num()
{
    cout << "Die Klasse liefer folgende Zahl: " << my_cls.getnum() << endl;
}

int main()
{
    
    bb obj_bb;
    print obj_p;
    obj_p.print_num();
    obj_p.my_cls = obj_bb;
    obj_p.print_num();
    return 0;
}



Ich hätte erwartet, dass die Ausgabe so aussieht:
"Die Klasse liefer folgende Zahl: 0"
"Die Klasse liefer folgende Zahl: 2"

Ausgegeben wird aber:
"Die Klasse liefer folgende Zahl: 0"
"Die Klasse liefer folgende Zahl: 0"

Es wird also immer auf die Basis-Klasse zugegriffen.

Was mache ich falsch ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.08.2003, 20:41 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich denke es sind zwei fehler. Zum einen das hier:

C++:
class print
{
    [...]
    interface_dummy my_cls;
    [...]
};


Egal, was Du my_cls, ob ein interface_dummy zuweist oder eine davon abgeleitete Klasse, durch die Zuweisung wird nur der Anteil von interface_dummy zugewiesen, dh bei

C++:
interface_dummy i;
bb b;
i = b;


wird dem i nur der interface_dummy Anteil von b Zugeordnet. Dies kannst Du nur umgehen, indem Du pointer verwendest und am gleichzeitig am besten gleich auf das problematische Design mit öffentlichen Attributen in der Klasse print verzeichtest. zB so:

C++:
class print
{
private:
    interface_dummy* my_cls;
    
public:
     void set_my_cls(interface_dummy& c) { my_cls = &c; } // Achtung: call by refernce!
     interface_dummy& get_my_cls() const { return * my_cls; }
};


Das ist zwar schion richtig, was ich da geschrieben habe, nur leider zeitigt es keinen Effekt. Der Grund ist der zweite Fehler: Die Methode get_num muß in interface_dummy virtuell gemacht werden. Denn nur so kann man mit einem interface_dummy Pointer oder einer Referenz darauf auf die Versionen von get:_num zugreffen, die in den Abgeleiteten Klassen überschrieben wurden. Also:

C++:

class interface_dummy        /* Das ist die Vorgabe für das Interface */
{
    public:
    [b]virtual[/b] int getnum();
};


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 04.08.2003 um 20:41 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.08.2003, 12:45 Uhr
~dummy
Gast


Danke !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: