object in c++



  • Hallo

    Gibt es in c++ was vergleichbares zu object von c#. Also ein Objekt dem ich Werte eines beliebigen Typs zuweisen kann?



  • void*
    

    ^^vielleicht? ansonsten nicht. in c++ haben objekte keinen gemeinsamen vorfahren.
    ­čÖé



  • Hallo. Jo void* ist ne Idee.

    Allerdings sto├če ich nun auf das Umwandlungsproblem.
    ├ťbergebe also einer Funktion einen void*

    in dieser Funktion wird anhand eines Wertes und mit Hilfe einer Switch Case Anweisung entschieden um welchen Datentyp es sich handelt.

    switch(datatype)
    {
    case BIT:
    Write((bool)(*void));
    break;

    case INT
    WRITE((int)(*void));
    break;

    usw.
    }

    Hier erhalte ich nun den Compilerfehler:
    - Ung├╝ltige Dereferenzierung.

    Wie caste ich hier richtig?



  • Du castest erst auf den Zeigertyp, dann derefernzierst du.



  • Sprich so:

    Write(*((int*)value));
    

    Ok das funktioniert. Klar andersrum gehts ja nicht. Nen void Pointer zu dereferenzieren geht schlecht.



  • Jetzt habe ich aber noch ein anderes Problem.
    Der Datentyp aus meiner Switch case Anweisung muss nicht der gleiche Datentyp sein den ich mit void* ├╝bergebe.

    Beispiel:

    Ich ├╝bergebe einen CString mit einem Wert von 10. Mein Datentyp ist ein short.
    Nun muss ich ja zuerst auf CString casten und danach auf short.

    Wie bekomme ich raus welcher Datentyp wirklich in void* steckt?



  • Das geht in native Code nicht.. Du kannst h├Âchstens einen Container-Typ wie VARIANT verwenden, der auch die Typ-Infos enth├Ąlt...



  • Genau, in Code eine recht einfache Variante:

    strukt Value
    {
      int type; // (oder enum ..)
      void* value;
    };
    


  • Mist. VARIANT geht auch nicht.

    Also vieleicht mal mein Problem weiter ausgef├╝hrt.
    Ich lese von einem Dialog einen Wert ein. Dieser ist ein CString. Dieser Wert soll nun an meine erw├Ąhnte Funktion ├╝bergeben werden. Diese entscheidet nun anhand einer weiteren auswahl in welchen Datentyp dieser Wert konvertiert werden soll. Soweit w├Ąre das ja kein Problem. Dann k├Ânnte ich der Funktion ja immer einen CString ├╝bergeben. Die Funktion wird aber nicht nur mit dem Wert aus dem Dialog aufgerufen sondern auch mit anderen Werten. Also z.B. short, int, double, usw. Also ben├Âtige ich einen unabh├Ąngigen Datentyp.

    Ich muss eine Funktionalit├Ąt nach programmieren die in c# programmiert wurde. Und dort wurde halt der Datentyp object verwendet.

    Hat mir jemand noch nen L├Âsungsansatz?



  • (schrei): VARIANT!



  • (schrei): VARIANT!

    Ja ok. Wollte halt nicht vorher noch sagen m├╝ssen was das f├╝r ein Typ ist den ich ├╝bergebe. Aber es geht ja nicht anders.



  • Und wie mache ich dann weiter. Jetzt entscheide ich anhand den Variantyps in was ich als erstes casten muss. Nun kann ich ja verschiedenste Variablen erhalten. Diese muss ich ja nun wieder anhand des "Datentyps" weiter casten. Wie mache ich das ohne ein riesen konstrukt an verschachteleter switch case anweisungen?



  • Hab ich jetzt nicht ganz verstanden... Was musst Du denn da "weiter casten"? Ich dachte Du stopfst nur einb Datentyp rein?

    Du kannst das ganze ja aber auch rekurzsiv machen... in einen VARAINT einen anderen VARIANT reinstopfen...



  • Hab ich jetzt nicht ganz verstanden... Was musst Du denn da "weiter casten"? Ich dachte Du stopfst nur einb Datentyp rein?

    Also ich stopf nun einen VARIANT rein. Der ist dann in unserem Beispiel ein CString bzw. BSTR im VARIANT.

    so nun holle ich den Wert aus dem VARIANT. Dass muss ich ja dann z.B. mit einem switch case machen. Nun muss ich den Wert wie anf├Ąnglich beschrieben in einen Datentyp casten der ausgew├Ąhlt wurde. z.B. Int.

    switch (value.vt)
    {
      case VT_BSTR:
        switch(datatype)
        {
          case BIT:
              Write((bool)value.bstrVal);
              break;
          case INT:
              Write((int)value.bstrVal);
              break;
          ...
    
        }
    
      case VT_I4:
        switch(datatype)
        {
          case BIT:
             Write((bool)value.intVal);
             break;
    
          ...
        }
    }
    


  • Die Funktion wird aber nicht nur mit dem Wert aus dem Dialog aufgerufen sondern auch mit anderen Werten. Also z.B. short, int, double, usw. Also ben├Âtige ich einen unabh├Ąngigen Datentyp.

    Das wuerde fuer mich eher ein Fall fuer Ueberladung sein.

    Ach ja: du kannst nicht durch casten einen String in einen Integer verwandeln. Casten ist was fuer Typen, nicht fuer Werte.



  • Das wuerde fuer mich eher ein Fall fuer Ueberladung sein.
    

    Im Prinzip hast du recht. Da mein C++ Projekt dem bereits erw├Ąhnten c# Projekt aber (fast) gleich sein sollte wollte ich auch hier nur eine Funktion. Klar wenn es nicht anders geht muss ich dann halt doch ├╝berladen ­čś×



  • Aber wenn ich ├ťberladungen nehme habe ich auch das Problem dass ich sehr viele switch case Konstrukte habe. Nur halt dieses mal in vielen Funktionen verteilt. Was ich auch nicht sch├Ân finde.



  • Ich verstehe es nicht ganz....

    Du hast doch blos ein "value" und da steckt der Wert *und* der Typ drin... was soll denn in Deinem Beispiel das "datatype" sein? Wo kommt das her?



  • Du hast doch blos ein "value" und da steckt der Wert *und* der Typ drin... was soll denn in Deinem Beispiel das "datatype" sein? Wo kommt das her?

    Nein ich habe 2 Datentypen.
    "Datatype" kommt von der Oberfl├Ąche. Also noch weiter ausgeholt. Ich lese eine Liste von Variablen von einem anderen System ein und stelle diese Werte in einer Liste dar. Nun kann ich einen Variable aus der Liste ausw├Ąhlen und erhalte von ihr, den aktuellen Wert und ihren Datentyp.

    z.b.

    Name: Info
    Typ: Double
    Wert: 5.0

    So nun m├Âchte ich den Wert ├Ąndern. Schreibe in die Textbox den neuen wert von 10. So da dies nun immer ein anderer Datentyp sein kann, ist das Textfeld ein String wert.

    Also nun steht eine 10 im Textfeld. Diese 10 soll nun der besagten Funktion ├╝bergeben werden. Und da die Funktion aber auch von einer anderen Stelle aufgerufen werden kann, muss diese Funktion nicht nur String entgegen nehmen sondern auch andere Werte. Deshal in c# object und in c++ void* oder VARIANT.

    Nun muss ich also in der Funktion den Wert aus dem Parameter heraus bekommen.

    Also z.B. der besagte String. Meine erstes switch case. Nun muss ich ja aber den wert, in unserem Beispiel, noch in double wandeln.

    Nun klar?



  • Ich verstehe nicht, warum Du Deinen "datatype" nicht in "value.vt" packst...

    Oder wenn Du willst auch einen eigene Struktur daf├╝r machst:

    tyepdef struct tMyVariant {
      DataTypes datatyp;
      union {
        int integer;
        bool boolean;
        std::string string; 
        // usw.
      }
    };
    

Log in to reply