Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ringpuffer - const #1

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

thomasspaeth
Copy link

Hi,
hier noch der Ringpuffer, den ich mal versucht habe, bei dem ich ein paar Methoden const gemacht habe. Bin mir allerdings nicht ganz sicher, ob es vernünftig ist, die Funktionen, die den Pointer verschieben const zu machen, da ich diesen ja dann mutable machen musste.

Thomas

@markusj
Copy link
Member

markusj commented Jun 29, 2012

Ich erinnere nochmal an Roberts Zusammenfassung von const: const ist die Zusicherung, dass sich das beobachtbare Verhalten der Klasse nicht verändert, insbesondere also Methoden die auf einer const Instanz aufgerufen werden dürfen keine nach außen hin sichtbaren/wirksamen Änderungen vornehmen.

Vor diesem Hintergrund: Du machst die Garantie, mit pop() nichts an einem const-Objekt zu verändern, tust das dann aber dennoch (und musst sogar mutable einsetzen damit der Compiler dich daran nicht hindert). Die gespeicherten (und auslesbaren) Daten sind nach pop() aber nicht mehr die gleichen, das verletzt die von dir mit const gegebene Garantie.

So, jetzt der schwierige Teil: Wo setzt du const sinnvoll ein? In dem momentanen Zustand der Klasse gibt es da nicht viel zu verändern. Du könntest aber zum Beispiel ein peek() Implementieren, welches dir das erste Element zurückgibt, ohne es zu entfernen (-> Keine Modifikation).

Üblicherweise hat man bei const Objekten immer nur einen eingeschränkten Funktionsumfang zur Verfügung, weil Modifikationen eben verboten sind.

@thomasspaeth
Copy link
Author

Okay, ich war mir da auch ziemlich unsicher, ob die Verschiebung des Pointers (der ja erst beim nächsten Aufruf sinnvoll wird) auch zu den "sichtbaren Veränderungen" gehört - aber im aktuellen Commit hab ich das mal rausgenommen.

In der Funktion element sollte es aber hinkommen, da veränder ich ja keine Pointer, sondern gebe nur ein beliebiges Element aus, oder?

@markusj
Copy link
Member

markusj commented Jun 30, 2012

In der Funktion element sollte es aber hinkommen, da veränder ich ja keine Pointer, sondern gebe nur ein beliebiges Element aus, oder?

Korrekt. Der nach außen hin sichtbare Zustand ändert sich nicht.

Ein anderes Beispiel: Wenn man die Fibo-LUT so programmiert hat, dass sie die Werte auf Anfrage berechnet und dann zwischenspeichert, kann die Berechnungs-Funktion durchaus const sein. Warum? Das beobachtbare Verhalten ("Berechnet n-te Fibo-Zahl") ändert sich durch die Zwischenspeicherung nicht.

@Koios
Copy link

Koios commented Jun 30, 2012

Okay, ich war mir da auch ziemlich unsicher, ob die Verschiebung des Pointers (der ja erst beim nächsten Aufruf sinnvoll wird) auch zu den "sichtbaren Veränderungen" gehört

Der Pointer ist von außen gar nicht sichtbar, er ist ja ein private member. Allerdings gehört zum beobachtbaren Verhalten einer Instanz der Klasse der Rückgabewert von pop und element. Wenn ich eine const-Funktion aufrufe, dann erwarte ich, dass sich die Instanz vorher und nachher genau gleich verhält. Bei einem Container von Daten erwarte ich also, dass dieselben Daten in derselben Reihenfolge drinstecken bzw. sich herausholen lassen.

Beispiel:

double return2nd(Ringpuffer const& p)
{
    return p.element(2);
}

int main()
{
    Ringpuffer m = {5};    // C++03: Ringpuffer m(5);
    m.push(4.2); m.push(2.1);

    std::cout << return2nd(m);

    // ich erwarte, dass sich an dieser Stelle m genauso verhält
    // (soweit ich das beobachten kann)
    // wie vor dem Funktionsaufruf!
    std::cout << m.pop();

    // ich erwarte _nicht_, dass m sich geändert hat
    // vielmehr erwarte ich sogar, _dass_ es sich geändert hat
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants