Init Konstruktor in Header?



  • Hi!

    Ist es erlaubt, wie hier das Volumen mit 55 vorzuinitialisieren?

    public:
    	PKW(void);
    	PKW(const string sName, double dMaxSpeed, const double p_dVerbrauch, const double p_dVolumen = 55);
    	virtual ~PKW(void);
    


  • Ja, das ist ein Default-Argument. Das ist bei allen Funktionen zulässig, nicht nur bei Konstruktoren.



  • Bashar schrieb:

    Ja, das ist ein Default-Argument. Das ist bei allen Funktionen zulässig, nicht nur bei Konstruktoren.

    Dazu noch eine Frage:

    class PKW :
    	public Fahrzeug
    {
    public:
    	PKW(void);
    	PKW(const string sName, double dMaxSpeed, const double p_dVerbrauch, const double p_dVolumen = 55);
    	virtual ~PKW(void);
    	double dTanken(double dMenge = p_dVolumen - p_dTankinhalt); //HIER!!!
    private: 
    	double p_dVerbrauch;
    	double p_dTankinhalt;
    	double p_dVolumen;
    
    	double dVerbrauch();
    };
    

    Ist es hier möglich auf die Klassenvariablen dVolumen und dTankinhalt zuzugreifen mit dTanken? Ich würde gerne diese default-Wert setzen.


  • Mod

    Ist es hier möglich auf die Klassenvariablen dVolumen und dTankinhalt zuzugreifen mit dTanken?

    In einem Default-Argument kann man nicht auf Klassenmember zugreifen. Allgemein kann man nicht auf andere Argumente in einem Default-Argument zugreifen (hier wäre das Argument der this -Zeiger).

    Ich würde gerne diese default-Wert setzen.

    Dan solltest du zwei Versionen dieser Funktion bereitstellen. Das nennt man Überladung.

    double dTanken(double dMenge);
    double dTanken() { return dTanken(p_dVolumen - p_dTankinhalt); }
    


  • Arcoth schrieb:

    Ist es hier möglich auf die Klassenvariablen dVolumen und dTankinhalt zuzugreifen mit dTanken?

    In einem Default-Argument kann man nicht auf Klassenmember zugreifen. Allgemein kann man nicht auf andere Argumente in einem Default-Argument zugreifen (hier wäre das Argument der this -Zeiger).

    Schade eigentlich. Ich sehe gar keine richtigen guten Gründe dafür.


  • Mod

    Bashar schrieb:

    Arcoth schrieb:

    Ist es hier möglich auf die Klassenvariablen dVolumen und dTankinhalt zuzugreifen mit dTanken?

    In einem Default-Argument kann man nicht auf Klassenmember zugreifen. Allgemein kann man nicht auf andere Argumente in einem Default-Argument zugreifen (hier wäre das Argument der this -Zeiger).

    Schade eigentlich. Ich sehe gar keine richtigen guten Gründe dafür.

    Da man den gewünschten Effekt durch Überladung erreichen kann, ist das kein Verlust.
    Und Mehrfachverwendung eines Argumentes würde eine Menge Probleme verursachen wenn das Objektargument ein temporäres Objekt ist. Die ganze Logik des Movens von rvakues beruht ja darauf, dass das jeweilige Objek effektiv aliasfrei ist.



  • Ich hätte besser zitieren sollen. Ich meinte eigentlich den Teil mit den Klassenmembern.

    (Davon abgesehen gibt es Default-Argumente schon deutlich länger als rvalues.)

    Außerdem ist die Begründung, dass man dasselbe durch Überladung erreichen kann, ein Argument gegen Default-Argumente an sich, das auch tatsächlich von Java-Apologeten benutzt wurde. Wenn das also die Begründung gegen Verbesserungen bei Default-Argumenten sein soll, kann man dann daraus schließen, dass Default-Argumente inzwischen als etwas schlechtes angesehen werden?



  • Bashar schrieb:

    Ich hätte besser zitieren sollen. Ich meinte eigentlich den Teil mit den Klassenmembern.

    Willst du aus Ausdrücken für Default-Werte von Argumenten auf private Member zugreifen können oder wie?
    Käme mir sehr komisch vor.
    Mir fällt jetzt zwar nix ein was wirklich dagegen spricht, da die Default-Werte ja in der Klasse mit drinstehen und daher "geschützt" sind - aber kommt mir trotzdem komisch vor.
    Und so wirklich abgehen tut's mir auch nicht.



  • hustbaer schrieb:

    Willst du aus Ausdrücken für Default-Werte von Argumenten auf private Member zugreifen können oder wie?

    Ja, das Beispiel siehst du gleich oben beim Threadstarter.


  • Mod

    Bashar schrieb:

    Ich hätte besser zitieren sollen. Ich meinte eigentlich den Teil mit den Klassenmembern.

    (Davon abgesehen gibt es Default-Argumente schon deutlich länger als rvalues.)

    Außerdem ist die Begründung, dass man dasselbe durch Überladung erreichen kann, ein Argument gegen Default-Argumente an sich, das auch tatsächlich von Java-Apologeten benutzt wurde. Wenn das also die Begründung gegen Verbesserungen bei Default-Argumenten sein soll, kann man dann daraus schließen, dass Default-Argumente inzwischen als etwas schlechtes angesehen werden?

    Das geht ein bisschen in die falsche Richtung. Will man historisch argumentieren, kommt man darauf, dass diese Verbesserung darauf hinausläuft; dass der Wert von Defaultargumenten von anderen Funktionsargumenten abhängen könnnen soll (in diesem speziellen Fall dem impliziten Objektargument).
    Also z.B.

    void foo(int a, int b = a);
    

    Das bereitet 2 Schwierigkeiten:
    1. erfordert es die Änderung der Lookupregeln, indem Funktionsparameter bereits innerhalb der Parameterliste sichtbar sind, offenbar mit der Folge, dass ggf. existierender Code anders interpretiert wird,
    2. führt es zu einer Abhängigkeit in der Reihenfolge der Auswertung der Funktionsparameter; während gegenwärtig keine Reihenfolge existiert.
    Letzteres dürfte historisch gesehen ein wesentlicher Grund sein, warum wir so etwas nicht haben; da es die Übersetzung in reinen C-Code erschweren würde.
    Wäre C++ neu zu entwerfen, käme eine solche Änderung vielleicht in Betracht, bezogen auf die existierende Sprache sehe ich aber keinen substantiellen Vorteil in einer solchen Verbesserung. Nur in diesem Sinne ist der Hinweis auf Überladung zu verstehen.



  • OK, ich hab nur an die Scopes gedacht. Aber die Auswertungsreihenfolge wäre selbst bei der eingeschränkten Version, in der man nur auf die Member, nicht aber auf beliebige Parameter Zugriff hat, ein Problem.


Log in to reply