Datentyp als Vorraussetzung



  • Dkpingi schrieb:

    Naja um genau zu sein möchte ich dass der Code nur ausgeführt wird wenn ein bestimmter Datentyp vorliegt (in meinem Fall string).

    if (x==string)
        {
         Anweisung
        }
    

    So in etwa...

    Das ist Unsinn. Entweder x ist ein String oder nicht, das steht bereits zur Compilezeit fest, da brauchst du auch kein if mehr.

    Erklär doch mal, was das eigentliche Problem ist, nicht was du für die Lösung hältst.


  • Administrator

    C++ hat eine statische Typisierung, was soviel heisst, dass der Typ sich zur Laufzeit nicht verändern kann. Eine Variable wird somit immer den gleichen Typ aufweisen und braucht nicht abgefragt zu werden.

    Daher ist dein Vorgehen in dieser Form völlig unnötig. Ausser dein Problem sieht anders aus und du erklärst es un falsch 😉

    Grüssli



  • Das if (x==string) war kein Lösungsansatz sondern ein Mittel zur Abstraktion von dem was ich erreichen möchte.
    Dass es so einfach nicht geht weiß ich.

    Also ich möchte,dass ich wenn ich meiner Klasse einen string übergebe sie ihn in eine Zahl umwandelt also muss ich erstmal feststellen ob das ein string ist.
    Der andere Datentyp in den umgewandelt wird ist int falls das hier Relevanz hat.





  • Das was c++ fan da gepostet hat sieht stark danach aus was ich meine ich sehs mir mal an.
    Falls ichs verstehe :p ist mein Problem gelöst.



  • Dkpingi schrieb:

    Das was c++ fan da gepostet hat sieht stark danach aus was ich meine ich sehs mir mal an.
    Falls ichs verstehe :p ist mein Problem gelöst.

    Wahrscheinlich ist Dein Problem nur umschifft worden, und Du bastelst Dir selbst einen Mechanismus, den C++ eigentlich bereist fertig eingebaut hat.
    RTTI benutzen zu müssen, ist den meisten Fällen ein Hinweis auf einen Designfehler.


  • Administrator

    Dkpingi schrieb:

    Also ich möchte,dass ich wenn ich meiner Klasse einen string übergebe sie ihn in eine Zahl umwandelt also muss ich erstmal feststellen ob das ein string ist.
    Der andere Datentyp in den umgewandelt wird ist int falls das hier Relevanz hat.

    void foo(std::string const& x)
    {
      std::istringstream iss(x);
      int number;
    
      iss >> number;
    
      // fortfahren.
    }
    

    x ist und wird immer ein std::string sein, wieso willst du x prüfen, ob es ein std::string ist? Das macht überhaupt gar keinen Sinn. Zeig mal die Funktion, welche du umsetzen möchtest!

    Grüssli



  • Das verstehe ich jetzt nicht ganz es gibt doch Typumwandlung also wieso sagst du dass x immer std::string bleibt?



  • Dkpingi schrieb:

    Das verstehe ich jetzt nicht ganz es gibt doch Typumwandlung also wieso sagst du dass x immer std::string bleibt?

    Wie soll diese Typumwandlung denn aussehen?



  • Die Fragestellung ist immernoch unklar! Zeig uns doch einfach mal was Du machen willst...

    Was die netten Menschen in diesem Thread Dir versuchen zu sagen:

    void funktion(std::string xxx)
    {
        // xxx IST und WIRD IMMER string bleiben.
        // es sei denn __DU__ wandelst es in irgendwas anderes um
        // aber dann weisst __DU__ doch wohl auch, welchen Typ "irgendwas anderes" hat, oder?
    }
    


  • Dkpingi schrieb:

    ...wenn ich meiner Klasse einen string übergebe ... muss ich erstmal feststellen ob das ein string ist....

    Da hast DU einen Knoten im Denken: Wenn es ein string ist, brauchst Du das nicht mehr zu prüfen (und "alles" ist ein String 😉 ).

    Du willst wahrscheinlich feststellen, ob man aus diesem String eine Ganzzahl (z.B.) extrahieren kann - und dafür sind die stream-Operatoren << und >> da.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Dkpingi schrieb:

    ...wenn ich meiner Klasse einen string übergebe ... muss ich erstmal feststellen ob das ein string ist....

    Da hast DU einen Knoten im Denken: Wenn es ein string ist, brauchst Du das nicht mehr zu prüfen (und "alles" ist ein String 😉 ).

    Du willst wahrscheinlich feststellen, ob man aus diesem String eine Ganzzahl (z.B.) extrahieren kann - und dafür sind die stream-Operatoren << und >> da.

    Gruß,

    Simon2.

    Stimmt ich habe grad einen Denkfehler.Das mit dem extrahieren der Ganzzahl klingt nach dem was ich wollte allerdings steht in meinem Lehrbuch irgendetwas von

    string str="123";
    int intzahl;
    intzahl=atoi(str.c_str());
    

    das wollte ich tun sobald ich festgestellt habe ob man nun Ganzzahlen extrahieren kann oder nicht.



  • Dkpingi schrieb:

    ...

    Sowas macht man besser mit std::stringstream

    #include <iostream>
    #include <sstream>
    #include <string>
    #include <limits>
    
    std::string str = "20";
    
    std::stringstream strstr;
    strstr << str;
    
    int zahl;
    if(!(strstr >> zahl))
    {
        std::cerr << "Fehler: " << str << " ist keine int.\n";
    }
    


  • Ja ich denke das trifft es.
    Vielen Dank an alle.



  • Simon2 schrieb:

    Dkpingi schrieb:

    ...wenn ich meiner Klasse einen string übergebe ... muss ich erstmal feststellen ob das ein string ist....

    Da hast DU einen Knoten im Denken: Wenn es ein string ist, brauchst Du das nicht mehr zu prüfen (und "alles" ist ein String 😉 ).

    Aber was wenn ich mal einen string mal einen vector und mal was anderes übergebe?



  • c++ fan 2008 schrieb:

    Aber was wenn ich mal einen string mal einen vector und mal was anderes übergebe?

    Wenn der Parameter vom Typ std::string ist, dann kannst Du keinen std::vector übergeben.



  • Die Klasse war für eine Übungsaufgabe zum Thema oop.
    Dort stand nur,dass man string und int Werte übergeben können muss.



  • Dkpingi schrieb:

    Die Klasse war für eine Übungsaufgabe zum Thema oop.
    Dort stand nur,dass man string und int Werte übergeben können muss.

    Dann war vielleicht Überladung gemeint:

    class MyClass
    {
       MyClass(int param); //wird bei MyClass mc(0) aufgerufen
       MyClass(const std::string& param); //wird bei MyClass mc("0") aufgerufen
    };
    

    Als konkretes Beispiel könnte z.B. eine Klasse für Uhrzeiten dienen, bei der man einmal eine Uhrzeit-Objekt über h, m und s als Integer anlegen kann:
    ClockTime ct(14, 30, 13)
    und einmal z.B. über einen String:
    ClockTime ct("14:30:13")

    Mit nur einem Konstruktor geht das aber nicht. Man muss einen für die Integers haben, und einen anderen für die Strings.



  • Danke für den Tipp die Klasse ist tatsächlich für Uhrzeiten 😉 .


Anmelden zum Antworten