polymorphes Verhalten bei Standarddatentypen.

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

polymorphes Verhalten bei Standarddatentypen.

Beitrag von canlot » So Okt 12, 2014 1:05 pm

Hallo ich habe eine Frage und zwar ist es in C# möglich einen von allen Datentypen verwendetet Datentypen zu verwenden.

Code: Alles auswählen

objekt var = "Hallo";
var = 5;
beides funktioniert in c#. Was ich aber eher bezwecken möchte:

Code: Alles auswählen

List<objekt> variablen = new List<objekt>();
variablen.Add("Erste");
variablen.Add(2);
Wie kann ich das gleiche in C++ realisieren?
Unwissenheit ist ein Segen

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: polymorphes Verhalten bei Standarddatentypen.

Beitrag von cloidnerux » So Okt 12, 2014 1:21 pm

Das einzige was mir bekannt ist, ist der void Pointer.
object ist im den Sinne auch nichts anderes, eine Referenz auf ein nicht näher bekanntes Objekt.
Dementsprechend:

Code: Alles auswählen

vector<void*> data;
data.push_back(&myData);
myType myData2 = (myData)*data.pop_back();
Redundanz macht wiederholen unnötig.
quod erat expectandum

Nemo
Beiträge: 37
Registriert: Sa Mär 02, 2013 3:18 pm

Re: polymorphes Verhalten bei Standarddatentypen.

Beitrag von Nemo » So Okt 12, 2014 1:40 pm

Von der puren Möglichkeit einmal abgesehen, wozu brauchst du ein solches Verhalten? Ich empfinde die Typsicherheit von C++ eigentlich als Vorteil.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: polymorphes Verhalten bei Standarddatentypen.

Beitrag von canlot » So Okt 12, 2014 2:20 pm

cloidnerux hat geschrieben:Das einzige was mir bekannt ist, ist der void Pointer.
object ist im den Sinne auch nichts anderes, eine Referenz auf ein nicht näher bekanntes Objekt.
Dementsprechend:

Code: Alles auswählen

vector<void*> data;
data.push_back(&myData);
myType myData2 = (myData)*data.pop_back();
Danke werde ich mal ausprobieren.
Nemo hat geschrieben:Von der puren Möglichkeit einmal abgesehen, wozu brauchst du ein solches Verhalten? Ich empfinde die Typsicherheit von C++ eigentlich als Vorteil.
Ich brauche es für mysql Ergebnis, wenn die Spalten durchiteriert werden gibt es verschiedene Datentypen die abgefragt werden, ich kann sie dann bequem in der Schleife zu einem Wörterbuch hinzufügen, Spaltenbezeichnung sowie den dazugehörigen Inhalt kann ich dann aus der Abfrage auslesen.
Unwissenheit ist ein Segen

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: polymorphes Verhalten bei Standarddatentypen.

Beitrag von cloidnerux » So Okt 12, 2014 2:57 pm

Ich brauche es für mysql Ergebnis, wenn die Spalten durchiteriert werden gibt es verschiedene Datentypen die abgefragt werden, ich kann sie dann bequem in der Schleife zu einem Wörterbuch hinzufügen, Spaltenbezeichnung sowie den dazugehörigen Inhalt kann ich dann aus der Abfrage auslesen.
Das Problem von void-Pointer ist, dass du keine Typinformationen mehr hast. Wenn du Daten damit speicherst, hast du keine Möglichkeit die Typen zu erkennen.
Besser ist es, eine Basisklasse anzulegen, deine Datentypen davon ableiten und mit Basisklassenpointern arbeiten.
So kannst du ein Typ-Feld oder ähnliches einbauen und so immer den Datentyp erkennen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: polymorphes Verhalten bei Standarddatentypen.

Beitrag von canlot » So Okt 12, 2014 4:25 pm

cloidnerux hat geschrieben:Das Problem von void-Pointer ist, dass du keine Typinformationen mehr hast. Wenn du Daten damit speicherst, hast du keine Möglichkeit die Typen zu erkennen.
Besser ist es, eine Basisklasse anzulegen, deine Datentypen davon ableiten und mit Basisklassenpointern arbeiten.
So kannst du ein Typ-Feld oder ähnliches einbauen und so immer den Datentyp erkennen.
Okay, wie sieht es mit dem auto - Datentypen in c++11?
Unwissenheit ist ein Segen

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: polymorphes Verhalten bei Standarddatentypen.

Beitrag von cloidnerux » So Okt 12, 2014 5:13 pm

auto ist mit var in C# zu vergleichen.
Es erlaubt dir halt, den Typ den du zuweist nicht explizit anzugeben, jedoch muss dieser eindeutig sein.
Ich muss beim anlegen einer auto-variablen auch implizit den Typ angeben.
Daher gehe ich davon aus, dass du auto nicht als Datentyp in einer Datenstruktur anwenden darfst.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: polymorphes Verhalten bei Standarddatentypen.

Beitrag von oenone » Mo Okt 13, 2014 8:44 am

In C# gibt es auch den Typ "dynamic", welcher auch das von dir gewünschte Verhalten hat:

http://msdn.microsoft.com/de-de/library/dd264741.aspx

Für C++ kannst du dir mal das hier ansehen:

Implementing a variant type from scratch in C++

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: polymorphes Verhalten bei Standarddatentypen.

Beitrag von Xin » Mo Okt 13, 2014 12:51 pm

canlot hat geschrieben:Hallo ich habe eine Frage und zwar ist es in C# möglich einen von allen Datentypen verwendetet Datentypen zu verwenden.

Code: Alles auswählen

objekt var = "Hallo";
var = 5;
beides funktioniert in c#.
Diese "Technik" nennt sich Boxing und entspricht mehr oder weniger - wie schon geschrieben - dem Void-Pointer. Da alles von object erbt, C# vorrangig mit Referenzen arbeitet, könntest Du alle Deine Objekte, die Du listen möchtest von einer class Object erben lassen.

Code: Alles auswählen

class Object
{
  public:
    virtual ~Object();   // <- wichtig!
};

class Double : public Object
{
   double Value;
  public:
    Double( double value ) : Value( value ) {}
};
Das ist in C# grundsätzlich gegeben und damit ein Unterschied zu C++, den Du in C++ ausformulieren musst.
canlot hat geschrieben:Was ich aber eher bezwecken möchte:

Code: Alles auswählen

List<objekt> variablen = new List<objekt>();
variablen.Add("Erste");
variablen.Add(2);
Wie kann ich das gleiche in C++ realisieren?
Nun kannst Du hingehen und Deine Liste konstruieren:

Code: Alles auswählen

class ObjectList
{
    std::list< Object * > Elements;
  public:
    void Add( char const * value ) { Elements.Add( new String( value ) ); }
    void Add( Double * value ) { Elements.Add( new Double( value ) ); }
    void Add( Integer * value ) { Elements.Add( new Integer( value ) ); }
    ...
};
Obwohl Du in C++ mehr schreiben musst, halte ich die C++ Variante für besser. In die C#-Liste kannst Du vom Integer zum GUI-Fenster zur Datenbankverbindung alles reinpacken. Mit Typsicherheit hast Du dann nichts mehr am Hut, weil nunmal absolut alles von 'object' abgeleitet ist. Bei C++ musst Du wenigstens sagen, welche Typen Du von Object ableiten willst, Du hast also wenigstens schonmal eine Auswahl von Möglichkeiten getroffen.

Bitte beachte, dass Die Object-List damit auch verantwortlich ist, die Objekte freizugeben. Es ist also zu überlegen statt

Code: Alles auswählen

    std::list< Object * > Elements;
lieber

Code: Alles auswählen

    std::list< std::shared_ptr< Object > > Elements;
zu nehmen.

Dein Objekt sollte das gemeinsame Interface abbilden. Also die Mindestqualifikation aller aufgelisteten Objekte. Das tut "object" in C# eben nicht. Du musst dann abfragen, um welches Object es sich handelt ( if( var is string ) ... ), was vollkommen gegenläufig zur Idee läuft, Elemente zu klassifizieren, um damit objektorientiert zu arbeiten. Das ist eher ein alter C-Stil.

Hier finden sich void-Pointer und 'object' in ihrer größten Gemeinsamkeit: Man sollte beides nicht nutzen. Auch in C# solltest Du alle aufgelisteten Objekte von einem gemeinsamen Interface ableiten und sollten sie kein gemeinsames Inteface besitzen, dann solltest Du Dich fragen, warum Du sie gemeinsam listest.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten