static_cast



  • Hi!
    ich habe eine basisklasse geld, die als private member wert und art hat. davon leite ich die klassen schein(bekommt den member registnummer dazu) und muenze(bekommt den member dmesser dazu) ab. nun habe ich einen zeiger auf geld und will zur ausgabe per static_cast auf den neuen member registnummer oder dmesser zugreifen...

    class portemonnaie {
    
    private:
    	 	class geld *M[100];
    
    ...lese schein ein ...
    
    for(int i=0;i<anzahl;i++){
             schein *s2 = <static_cast>(schein*) M[i];
    	muenze *m2 = <static_cast>(muenze*) M[i];
    	if(s2) { cout << "schein" << endl; }
    	else if(m2)  { cout << "muenze" << endl; }
    }
    
    ...
    

    was mache ich falsch? der cast funzt nicht... 😞
    freue mich über jede hilfe...



  • Kenn mich damit nicht so aus, aber müsste es nciht heißen

    static_cast<schein*> &M[i]

    ?



  • so funzt es auch nicht 😞
    ist es denn sicher das ich einen statitic_cast machen muss?! geht es vielleicht auch mit einem dynamic_cast? wo würde der unterschied liegen?



  • mit dem static_cast gibt es immer die fehlermeldung
    "portemonnaie.cpp:142: error: invalid conversion from `geld*' to `schein*'"

    wieso geht das nicht?? geld ist die basisklasse von schein...
    danke für jede hilfe...

    schein *s2 = static_cast<geld*>(M[i]);
    muenze *m2 = static_cast<geld*>(M[i]);
    if(s2) { cout << "schein..." << endl; }
    else if(m2)  { cout << "muenze..." << endl; }
    


  • Hallo moneymaker, der Cast geht so:

    schein *s= static_cast<schein*> (M[i]);

    wenn du prüfen willst, ob der Cast erfolgreich war, nimm aber besser dynamic_cast:

    schein *s= dynamic_cast<schein*> (M[i]);

    if (s) //cast erfolgreich

    abgesehen davon ist so eine Typunterscheidung von angeleiteten Klassen nicht grade besonders elegant. Versuch besser virtuelle Methoden zu benutzen.

    cu



  • danke... ich habe es jetzt so, mit dem static_cast... nur kann ich immer noch nicht auf die elemente der unterklasse zugreifen... 😞

    void portemonnaie::ausgabe(){
      for(int i=0;i<anzahl;i++){
    
        schein *s = static_cast<schein*>(M[i]);
        muenze *m = static_cast<muenze*>(M[i]);
        if(s) { 
          cout << "schein..." << endl; 
          cout << s->get_wert()/100 << s->get_art() << "Registriernummer : " << s->get_nummer() << endl;
        }
        else if(m) {
          cout << "muenze..." << endl; 
          if (M[i]->get_art() == " Cent Muenze") cout << M[i]->get_wert() << M[i]->get_art() << endl;
          else cout << m->get_wert()/100 << m->get_art() << "Durchmesser : " << m.get_durchmesser() << endl;
        }
      }	
    }
    

    wie würde es denn mit virtual gehen?! kannst du mir es vielleicht erklären?! kenne virtual noch nicht so gut...



  • @Shady: Er will je nach Typ verschiedene Methoden aufrufen, mal die Registriernummer, mal den Durchmesser, ... .

    Das wirst du wohl kaum mit virtuellen Methoden hinbekommen.



  • wenn du es so machen willst, nimm dynamic_cast anstatt static_cast!
    static_cast ist rohe Gewalt, während dynamic_cast prüft ob die KOnvertierung möglich ist.

    wie virtuelle Methoden genau funktioniern, da lies dir am besten mal irgendein Tutorial oder so durch, in deinem Beispiel könntest du es etwa so verwenden:

    class geld
    {
      //..
      virtual std::string text() = 0;
    };
    
    class muenze: public geld
    {
       //..
      std::string text()
      {
         std::string s= "Münze ";
         s+= "blablaba";
         return s;
      }
    };
    
    class schein: public geld
    {
    //..
      std::string text()
      {
         std::string s= "Schein ";
         s+= "usw.";
         return s;
      }
    
    };
    

    in Portemonnaie::ausgeben() müsstest du dann nur noch das schreiben:

    for (int i=0; i<anzahl; ++i)
      std::cout << M[i]->text() ;  //text() wird dynamisch für Münze oder Schein
                                   //aufgerufen
    

    das wars 🙂



  • @Shady: Er will je nach Typ verschiedene Methoden aufrufen, mal die Registriernummer, mal den Durchmesser, ... .

    Das wirst du wohl kaum mit virtuellen Methoden hinbekommen.

    Er kann es ja zB so machen, wie in meinem Beispiel grad und den Ausgabetext in die Klassen selber verlagern. Wenn man das nicht so haben will, wird es natürlich schwierig keine Typunterscheidung zu machen. Aber in jedem Fall ist es denk ich gut, wenn man versucht Casterei in so einem Fall zu vermeiden



  • Mal 'ne Frage an unseren moneymaker:
    get_art ist doch wohl schon wirtuell oder? Wie machst du es sonst, dass abhängig von dem, was es ist die Korrekte "Art" ausgegeben wird.



  • die methoden, die in den abgeleiteten klassen stehen, stehen in der basisklasse als virtual...
    ist das nicht richtig?!


Log in to reply