[gelöst] discards qualifiers



  • EDIT: es lag daran das 'pulse' selber const war...

    Ich habe anscheint ein Problem mit const.

    Die Funktionen liefern kein const zurück. z.B.

    std::vector<std::complex<double> > & time();
    

    Ich übergebe nun an Funktionen mit const & und bekomme Fehler:

    vector<double> timeAmplitude = amplitude(pulse->time());
        ui->curvePlotTimeAmplitude->curve(0)->setData(pulse->timeAxis(), timeAmplitude);
        ui->curvePlotTimeAmplitude->curve(0)->setData(pulse->timeAxis(), amplitude(pulse->time()));
    
    void QCurve::setData(const vector<double> & xData, const vector<double> & yData);
    

    src\mainwindow.cpp:109: error: passing 'const LaserPulse' as 'this' argument of 'std::vector<std::complex<double>, std::allocator<std::complex<double> > >& LaserPulse::time()' discards qualifiers
    src\mainwindow.cpp:110: error: passing 'const LaserPulse' as 'this' argument of 'std::vector<double, std::allocator<double> >& LaserPulse::timeAxis()' discards qualifiers
    src\mainwindow.cpp:111: error: passing 'const LaserPulse' as 'this' argument of 'std::vector<double, std::allocator<double> >& LaserPulse::timeAxis()' discards qualifiers
    src\mainwindow.cpp:111: error: passing 'const LaserPulse' as 'this' argument of 'std::vector<std::complex<double>, std::allocator<std::complex<double> > >& LaserPulse::time()' discards qualifiers

    Wie werde ich das Problem nun los?



  • EDIT: es lag daran das 'pulse' selber const war...

    Vermutlich liegt es eher daran, dass bei time/timeAxis const correctness nicht eingehalten wurde.



  • Athar schrieb:

    EDIT: es lag daran das 'pulse' selber const war...

    Vermutlich liegt es eher daran, dass bei time/timeAxis const correctness nicht eingehalten wurde.

    Da der Code kompiliert und weder time noch timeAxis const sind stimme meine obige Aussage.



  • pospiech schrieb:

    Da der Code kompiliert und weder time noch timeAxis const sind stimme meine obige Aussage.

    Die Begründung ist Unsinn.

    Wird pulse in diesem Codeabschnitt geändert? Nein? Dann sollte es kein Problem sein, wenn pulse const ist.

    Ändern time() oder timeAxis() ihr LaserPulse-Objekt? Nein? Dann sollten sie const deklariert sein.

    Klar, wenn du const überall weglässt, geht auch alles. Tolle "Lösung".



  • MFK schrieb:

    Ändern time() oder timeAxis() ihr LaserPulse-Objekt? Nein? Dann sollten sie const deklariert sein.

    Ja, time und timeAxis ändern das Objekt. Das tun Sie weil die Daten entweder direkt gesetzt oder berechnet sein können. Und bei der Abfrage werden - falls nötig - die Daten erst berechnet.



  • pospiech schrieb:

    Ja, time und timeAxis ändern das Objekt. Das tun Sie weil die Daten entweder direkt gesetzt oder berechnet sein können. Und bei der Abfrage werden - falls nötig - die Daten erst berechnet.

    Was da intern passiert, ist nicht so wichtig. Die Frage ist: Ändern diese Methoden den von außen wahrnehmbaren Zustand des Objekts? Verhält sich das LaserPulse-Objekt nach dem Aufruf von time oder timeAxis anders als vorher?

    Man müsste das wohl genauer untersuchen und ggf. mutable benutzen.



  • MFK schrieb:

    pospiech schrieb:

    Ja, time und timeAxis ändern das Objekt. Das tun Sie weil die Daten entweder direkt gesetzt oder berechnet sein können. Und bei der Abfrage werden - falls nötig - die Daten erst berechnet.

    Was da intern passiert, ist nicht so wichtig. Die Frage ist: Ändern diese Methoden den von außen wahrnehmbaren Zustand des Objekts? Verhält sich das LaserPulse-Objekt nach dem Aufruf von time oder timeAxis anders als vorher?

    Nein das tut es nicht. Aber ich kann keine Member Funktion const deklarieren wenn Sie selber die Daten der Klasse ändert, bzw Funktionen aufruft die das tun und daher nicht const deklariert sein können. Oder habe ich was falsch verstanden?



  • pospiech schrieb:

    Aber ich kann keine Member Funktion const deklarieren wenn Sie selber die Daten der Klasse ändert, bzw Funktionen aufruft die das tun und daher nicht const deklariert sein können.

    Genau dafür gibt's mutable. Als mutable deklarierte Member darfst du auch in const-Methoden ändern.


Anmelden zum Antworten