Heim  >  Artikel  >  Backend-Entwicklung  >  C++-Kompilierungsfehler: Nicht-konstante Objekte können keine konstanten Memberfunktionen aufrufen. Wie kann das Problem gelöst werden?

C++-Kompilierungsfehler: Nicht-konstante Objekte können keine konstanten Memberfunktionen aufrufen. Wie kann das Problem gelöst werden?

PHPz
PHPzOriginal
2023-08-21 21:33:061141Durchsuche

C++-Kompilierungsfehler: Nicht-konstante Objekte können keine konstanten Mitgliedsfunktionen aufrufen. Wie kann man ihn lösen?

In C++ bezieht sich die const-Memberfunktion auf das Hinzufügen des const-Schlüsselworts nach der Funktionsdeklaration, was bedeutet, dass die Funktion den Status des Objekts nicht ändert. Wenn ein Objekt vom Typ const ist, können normale, nicht konstante Memberfunktionen nicht aufgerufen werden, jedoch konstante Memberfunktionen. Wenn jedoch ein nicht konstantes Objekt eine konstante Mitgliedsfunktion aufruft, tritt beim Kompilieren der folgende Fehler auf: Nicht konstante Objekte können keine konstante Mitgliedsfunktionen aufrufen.

Dieser Fehler tritt normalerweise in den folgenden zwei Situationen auf:

  1. Ein nicht-konstantes Objekt ruft eine konstante Member-Funktion auf.

Ein Beispiel:

class Example {
public:
  void doSomething() const {
    // const function
  }
};

int main() {
  Example obj;
  obj.doSomething(); // 编译错误
  return 0;
}

Wenn eine konstante Member-Funktion für ein nicht-konstantes Objekt aufgerufen wird, wird der Compiler wird den oben genannten Fehler geben. Dies liegt daran, dass der Zustand des Objekts durch Funktionen geändert werden kann und der Compiler keine Möglichkeit hat zu wissen, ob eine const-Memberfunktion das Objekt wirklich nicht ändert.

Lösung:

Um diesen Fehler zu vermeiden, müssen Sie das aufrufende Objekt als const markieren. Dies kann durch Hinzufügen des const-Schlüsselworts nach dem Objekttyp erreicht werden, zum Beispiel:

const Example obj;
obj.doSomething(); // 正确,因为 obj 是 const 类型的
  1. const-Objekt ruft eine nicht konstante Memberfunktion auf

Zum Beispiel:

class Example {
public:
  void doSomething() {
    // non-const function
  }
};

int main() {
  const Example obj;
  obj.doSomething(); // 编译错误
  return 0;
}

In diesem Fall, da das Objekt vom Typ const ist , geht der Compiler davon aus, dass der Status des Objekts nicht geändert werden kann, und weigert sich daher, nicht konstante Memberfunktionen aufzurufen.

Problemumgehung:

Wenn Sie den Status des Objekts wirklich ändern müssen, können Sie es in einen nicht konstanten Typ konvertieren. Dies kann durch die Verwendung des Typkonvertierungsoperators const_cast erreicht werden, zum Beispiel:

const Example obj;
const_cast<Example&>(obj).doSomething(); // 正确,但不建议这样做

Es ​​ist zu beachten, dass die Verwendung von const_cast zur Typkonvertierung zu undefiniertem Verhalten führen kann, daher sollte die Verwendung in formalem Code vermieden werden.

Zusammenfassung

Das Obige sind die Lösungen für zwei häufige C++-Kompilierungsfehler: Nicht-konstante Objekte können keine konstanten Memberfunktionen aufrufen. Beim Schreiben von Code sollten Sie darauf achten, const-Memberfunktionen als const zu kennzeichnen und den Aufruf von nicht-const-Memberfunktionen für const-Objekte zu vermeiden. Wenn Sie den Status eines const-Objekts wirklich ändern müssen, sollten Sie const_cast für die Typkonvertierung verwenden, die Verwendung in formalem Code sollten Sie jedoch vermeiden.

Das obige ist der detaillierte Inhalt vonC++-Kompilierungsfehler: Nicht-konstante Objekte können keine konstanten Memberfunktionen aufrufen. Wie kann das Problem gelöst werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn