| 

.NET C# Java Javascript Exception

2
Hallo,

ich habe eine einfache Klassenstruktur:
class A{}
class B : public A{}
class C : public A{}
class D : public A{}
class E : public A{}

Dazu gibts eine Factory mit paar statischen Methoden um mir einen pointer auf ein A zu geben.
In der Factory gibt es noch weitere Funktionen die intern auf den genauen Subtyp prüfen (wird doch Dispatcher genannt, oder?)

Jetzt würde ich das gern bündeln. Ich stelle mir etwas vor wie:
class Factory
{
...
Type Gettype(A* src)
{
if(B* tmp = dynamic_cast<B*>(src))
return typeof(B);
...
}
void Foo()
{
Type mytype = GetType(new C*); //testweise fürs prinzip
mytype* ptr = new mytype();
}
}



Any ideas? Wenn ich das so hätte, könnte ich das dispatchen auf 2 Stellen im Code einschränken.

Grüße
Barados
20.06.2011
Barados 288 1 7
Barados 288 1 7
3 Antworten
2
Auf Deine Frage "Wie weit gehen dynamische Typinformationen in C++?" kann ich leider nur sagen: "Nicht weit genug!"

Du hast die Möglichkeit, über typeof die Typ-ID abzurufen, die einem lediglich den Typnamen verrät und neben einem Vergleich noch ermitteln lässt, ob ein Typ von einem anderen abgeleitet ist.

Willst Du Objekte in C++ dynamisch erzeugen, musst Du das zu Fuss (d.h. selbst programmiert) erledigen.

Wenn Du schon die MFC ansprichst: Am bequemsten ist es, die dort vorhandenen Implementierungen zu nutzen, die über die Makros DECLARE_DYNAMIC und IMPLEMENT_DYNAMIC repräsentiert werden. Zumindest findest Du dort einen funktionierenden und brauchbaren Ansatz für eine eigene Lösung.

PS: Wenn Du managed C++ verwendest, hast du natürlich auch alle Möglichkeiten, die .NET bietet.
21.06.2011
Andreas Ganzer 1,4k 1 8
1
Sicher, dass Du das willst (abgesehen von dem Fall, dass es so nicht geht :-)?

Eigentlich sollte es nur bei der Erzeugung der Instanzen eine Typ-Unterscheidung geben. Danach sollte es egal sein. Wenn es Methoden gibt, die den genauen Typ brauchen, um eine Methode aufzurufen, solltest Du diese Methode vielleicht in A mit einer leeren Implementierung hinterlegen und immer aufrufen. Du handelst Dir einen Berg voll Probleme ein, wenn Du auf explizite Subtypen prüfst.

Wenn es gar nicht anders geht, pack doch in A folgende Methoden hinzu:

virtual B *asB() { return 0l; }
virtual C *asC() { return 0l; }


In den Subtyp B kannst Du die Methode überladen:

B *asB() { return this; }


Und im Subtyp C analog:

C *asC() { return this; }


Aber Du kriegst vermutlich besseren Code, wenn Du das Prüfen auf einen Subtyp vermeiden kannst.
21.06.2011
theorist 494 6
0
Hallo,

dass da ein Designfehler vorliegt ist mir leider stark bewußt, aber mir wurde nicht genug Zeit gegeben ein komplettes Refactoring durchzuführen.
Den angesprochenen Fall konnte ich jetzt auflösen, aber ich glaube nicht dass es komplett schön wird^^

Im Endeffeckt geht es mir gerad eher um die Machbarkeit des Ganzen, und std::C++ gibt das anscheinend nicht her. Bewahrt einen wahrscheinlich auch vor dem einen oder anderen Designfehler.

Dank euch aber Beiden.

Grüße
Barados
21.06.2011
Barados 288 1 7

Stelle deine Cplusplus-Frage jetzt!