Ich möchte eine Frage über die Const-Korrektheit von Methoden stellen. Lassen Sie mich die Situation veranschaulichen.Ist es eine gute Übung, eine Methode zu erstellen, die Daten außerhalb der Klasse const ändert?
class MyClass
{
public:
...
void DiscussedMethod() { otherClass->NonConstMethod(); }
private:
OtherClass *otherClass;
};
Ich habe eine Klasse MyClass
die einen Zeiger auf OtherClass
hält. In.ruft es OtherClass::NonConstMethod
auf, das einige sichtbare Daten ändert.
Ich würde gerne wissen, ob es eine gute Praxis wäre, die DiscussedMethod
const
zu machen (da es keine Mitgliedsdaten ändert)? Wäre es eine schlechte Übung? Oder ist beides in Ordnung?
Was, wenn die OtherClass
einen Zeiger auf die MyClass
und in NonConstMethod
einige der Daten "MyClass
modifizierte gehalten (was bedeutet, dass die MyClass
Mitgliedsdaten während des DiscussedMethod
Anrufs ändern würden). Wäre es eine schlechte Übung, die DiscussedMethod
const
dann zu machen?
Soweit ich habe in der Lage gewesen, die const
auf ein Verfahren, um herauszufinden, ist meist ein Code, was zu dokumentieren, so würde ich wahrscheinlich neigen zu nicht den DiscussedMethod
const
machen, aber ich möchte Ihre Meinung hören.
EDIT: Einige Antworten nehmen die berücksichtigt, ob das Objekt darauf durch otherClass
durch das MyClass
Objekt gehört. Dies ist in dem Szenario, mit dem ich arbeite, nicht der Fall. Nehmen wir an, dass beide Objekte unabhängig nebeneinander existieren (mit der Fähigkeit, sich gegenseitig zu ändern). Ich denke, diese Analogie beschreibt meine Situation ziemlich gut.
Betrachten Sie zum Beispiel etwas wie doppelt verknüpfte Liste, wobei jedes Element eine Klasse ist, die Zeiger auf seine Nachbarn und Elementvariable hält. Und es hat Methode MakeNeighboursRed
, die die color
seiner Nachbarn ändert, aber nicht den Zustand des aufrufenden Objekts selbst beeinflusst. Sollte ich darüber nachdenken, diese Methode const
zu machen?
Und was, wenn es eine Möglichkeit gäbe, dass MakeNeighboursRed
Nachbarn MakeNeighboursRed
aufrufen würde. Am Ende würde sich also auch der Zustand des Objekts ändern, für das ursprünglich MakeNeighboursRed
aufgerufen wurde.
Und ich möchte Ihnen allen für Ihre Meinungen danken :-)
Dies ist nur meine persönliche Meinung. Manchmal wies das Objekt darauf hin, dass ich "Teil des Hauptobjekts" betrachte. Das heißt, ich hätte 'OtherClass' wahrscheinlich zu einem Vollmitglied gemacht, aber es musste dynamisch/polymorph/etc sein. In diesem Fall würde ich die Funktion nicht konstant machen, auch wenn es möglich wäre. –
In Bezug auf Ihre Bearbeitung: Ich bleibe bei meiner Antwort: Wenn das Aufrufen einer Methode den Zustand Ihres Objekts ändern kann, sollte es nicht const sein. (Das heißt, Sie ändern den Nachbarn, der wiederum diesen Zustand möglicherweise ändert.) Ich würde eine const-Methode erwarten, um den Zustand des Objekts zu erhalten. – Pixelchemist