string- default argument



  • Warum geht das nicht:

    #include <iostream>
    #include <string>
    using namespace std;
    
    class game
    {
        public:
        inline int get_controller() const {return m_controller;}
        void story_part(string question,
                        string a, string b, string c,
                        string effect1, string effect2=0, string effect3=0);
    
        private:
        int m_controller;
    
    };
    
    void game::story_part(string question,
                          string a, string b, string c,
                          string effect1, string effect2=0, string effect3=0)
    {
    
    }
    
    int main()
    {
    
    	return 0;
    }
    

    ???

    MELDUNG:

    -------------- Build: Debug in GAME ---------------
    Compiling: main.cpp
    main.cpp:22: error: default argument given for parameter 6 of void game::story_part(std::string, std::string, std::string, std::string, std::string, std::string, std::string)' main.cpp:11: error: after previous specification invoid game::story_part(std::string, std::string, std::string, std::string, std::string, std::string, std::string)'
    main.cpp:22: error: default argument given for parameter 7 of void game::story_part(std::string, std::string, std::string, std::string, std::string, std::string, std::string)' main.cpp:11: error: after previous specification invoid game::story_part(std::string, std::string, std::string, std::string, std::string, std::string, std::string)'
    Process terminated with status 1 (0 minutes, 0 seconds)
    4 errors, 0 warnings

    MfG
    Stromberg



  • Naja, schonmal das versucht:

    Stromberg schrieb:

    ...
    string effect2=0;
    ...
    

    Klappt auch nicht, oder ?

    Anders ausgedrückt: Welche string-Konstruktor soll für effect2 denn aufgerufen werden ? 😃

    Gruß,

    Simon2.



  • Mh, Konstruktor? Ich will des halt so machen, das wenn man für "effect2" und "effect3" nix einträgt, das dann halt in "effet2" und "effect3" 0 drin steht.
    Weiß jemand was ich mein?

    MfG
    Stromberg


  • Mod

    Stromberg schrieb:

    Mh, Konstruktor? Ich will des halt so machen, das wenn man für "effect2" und "effect3" nix einträgt, das dann halt in "effet2" und "effect3" 0 drin steht.
    Weiß jemand was ich mein?

    std::string repräsentiert Zeichenketten, keine Zahlen. 0 ist eine Zahl. Schlussfolgerung: 0 kann nicht in einem std::string drin stehen.



  • versuchs einfach mit effect3 = "0", dafür sollte es nen konstruktor geben.



  • Stromberg schrieb:

    Mh, Konstruktor? Ich will des halt so machen, das wenn man für "effect2" und "effect3" nix einträgt, das dann halt in "effet2" und "effect3" 0 drin steht....

    Eben: Und wie macht man dass, das in einem Objekt bei der Erzeugung "etwas drinsteht": Mit dem Konstruktor !
    So auch hier.
    Übrigens: Soll da wirklich der Buchstabe '0' drinstehen ? Oder möchtest Du nicht viel lieber einen "leeren String" (Also ein "" ) ?

    DrPhil_Guth schrieb:

    versuchs einfach mit effect3 = "0", dafür sollte es nen konstruktor geben.

    Ich vermute halt, dass Du mit

    ..., effect3 = "", ...
    

    das bekommst, was Du willst.
    Es spielt dabei keinen Rolle, ob Du innerhalb einer Parameterliste oder "einfach so" beim Erzeugen eines Objekts einen Initialwert vorgibst: Es muss einen passenden Konstruktor geben.

    Gruß,

    Simon2.



  • Weiterer Fehler:

    Bei der Definition der Methode dürfen keine Default-Argument mehr angegeben werden, nur bei der Deklaration!

    also:

    class X
    {
    void y(int x = 0);
    };
    

    und

    void X::y(int x)
    {
    }
    


  • Merker² schrieb:

    Bei der Definition der Methode dürfen keine Default-Argument mehr angegeben werden, nur bei der Deklaration!

    Du darfst schon - nur nicht die selben:

    class X
    {
      void y(int a,int b=0);
    };
    
    void X::y(int a=4711,int b)//übernimmt den Default-Parameter b=0 von der Deklaration
    {
      ...
    }
    

    (btw, die Default-Parameter 'string effect3 = 0' sind witzigerweise legal (0 kann in jeden Zeigertyp umgewandelt werden, auch char*), aber wie gut std::string mit einem NULL-Pointer umgehen kann, ist die andere Frage)



  • CStoll schrieb:

    Du darfst schon - nur nicht die selben:

    Heisst das, die Angabe identischer Defaults an beiden Stellen führt zum Fehler, die Angabe unterschiedlicher Defaults aber nicht?!

    Fände ich doch schon suspekt 😉

    Der GCC meldet übrigens in beiden Fällen einen Fehler.

    EDIT:
    Falsch verstanden - nicht unterschiedliche Defaults für den selben Parameter, sondern für unterschiedliche Parameter. Finde ich aber trotzdem merkwürdig, heisst das etwa, dass man in der ÜE nach der Definition von X::y diese mit keinem Parameter aufrufen dürfte, in allen anderen ÜE, wo nur die Deklaration vorhanden ist jedoch nicht?



  • LordJaxom schrieb:

    EDIT:
    Falsch verstanden - nicht unterschiedliche Defaults für den selben Parameter, sondern für unterschiedliche Parameter. Finde ich aber trotzdem merkwürdig, heisst das etwa, dass man in der ÜE nach der Definition von X::y diese mit keinem Parameter aufrufen dürfte, in allen anderen ÜE, wo nur die Deklaration vorhanden ist jedoch nicht?

    Ja, das heißt es - praktisch genutzt habe ich das allerdings noch nicht.


  • Mod

    CStoll schrieb:

    wie gut std::string mit einem NULL-Pointer umgehen kann, ist die andere Frag

    Ausdrücklich undefiniert.


Anmelden zum Antworten