4 Stimmen

über eine Konstantenreferenz der Klasse

void foo(const ClassName &name)
{
    ...
}

Wie kann ich auf die Methode der Klasseninstanz name zugreifen?

name.method() Hat nicht funktioniert. Dann habe ich es versucht:

void foo(const ClassName &name)
{
    ClassName temp = name;
    ... ....
}

Ich kann temp.method verwenden, aber nachdem foo ausgeführt wurde, ist der ursprüngliche Name durcheinander geraten, irgendeine Idee? BTW, die Mitgliedsvariable des Namens nicht vermasselt, aber es war die Mitgliedsvariable der Unterklasse der Klasse vermasselt.

6voto

Naveen Punkte 71443

Nach der Beschreibung, die Sie gegeben haben, sieht es so aus method() en ClassName ist eine Nicht-Konst-Methode. Wenn Sie versuchen, eine Non-Const-Methode auf einem Const-Objekt aufzurufen, gibt der Compiler einen Fehler aus. Wenn Sie ClassName temp = name; Sie haben eine kopieren. der Variablen in ein temporäres Nicht-Konst-Objekt temp . Sie können jede beliebige Methode für dieses Objekt aufrufen, aber da es sich um eine Kopie handelt, werden die an diesem Objekt vorgenommenen Änderungen nicht in name Objekt.

EDIT

Der beste Weg, dies zu lösen, besteht darin, die ClassName::method const, wenn es keine Mitgliedsvariablen ändert. Wenn dies der Fall ist, sollten Sie Ihren Parameter nicht in die Funktion foo als const-Referenz. Sie sollten Parameter als Nicht-Konst-Referenz nehmen.

4voto

Péter Török Punkte 111735

Wenn ich Sie richtig verstehe, wollen Sie die name.method() innerhalb foo() und der Compiler lässt Sie nicht. Ist ClassName::method() zufällig eine nicht-konstante Methode? Da name wird als eine const Parameter zu foo() können Sie nur aufrufen const Funktionen darauf.

Aktualisierung: wenn ClassName::method() nicht konstant ist, aber den Zustand nicht wirklich ändert, wäre es natürlich am besten, es zu const . Für den Fall, dass Sie das aus irgendeinem Grund nicht können, sehe ich die folgenden Möglichkeiten:

  • (der offensichtliche Weg, wie @Naveen aufgezeigt hat - danke :-) erklären name als nicht-konstanter Methodenparameter.
  • eine nicht-konstante Kopie von name und rufen Sie method darauf - wie Sie es tatsächlich getan haben. Dies funktioniert jedoch nur, wenn der Zuweisungsoperator und/oder der Kopierkonstruktor richtig implementiert ist für ClassName . Sie schreiben jedoch "nachdem foo ausgeführt wurde, ist der ursprüngliche Name durcheinander geraten" Das ist eine sehr vage Beschreibung, aber sie kann so interpretiert werden, dass das Kopieren einige unerwünschte Nebenwirkungen auf name was darauf schließen lässt, dass diese Funktionen nicht korrekt oder überhaupt nicht implementiert sind.
  • (auf die böse Art) die Verstopfung mit const_cast - dies sollte wirklich ein letzter Ausweg sein, und nur, wenn Sie sicher sind, dass ClassName::method() ändert eigentlich keinen Zustand.

Aktualisierung2 zu @AKNs Kommentar - Beispiel für das Wegwerfen von Konstanten:

void foo(const ClassName &name)
{
    ClassName& temp = const_cast<ClassName&>(name);
    ... ....
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X