Gelöst: Ausdruck muss Klassentypfehler in C++ haben
- Gelöst: Ausdruck muss Klassentypfehler in C++ haben
- Ursache des Ausdrucks Must Have Class Type Error in C++
-
Behebung des Fehlers
Ausdruck muss Klassentyp haben
in C++ - Abschluss
In C++ wird der Punktoperator (.
) für die direkte Elementauswahl verwendet, während der Pfeiloperator (->
) andererseits für die indirekte Elementauswahl verwendet wird. Diese beiden Operatoren haben Bedeutung, aber Sie müssen vorsichtig sein, wo und wie Sie sie verwenden.
Dies hängt normalerweise davon ab, ob das Objekt mit dem Operator new
instanziiert wird oder nicht. Wir werden dies alles besprechen, aber wissen Sie vorerst, dass der Fehler Ausdruck muss Klassentyp haben
ein solcher C++-Fehler ist, der durch die falsche Verwendung des Punktoperators (.
) auftritt.
Lassen Sie uns sehen, warum dies passiert und wie man es löst.
Gelöst: Ausdruck muss Klassentypfehler in C++ haben
Sehen Sie sich den folgenden Code an, um die Problemstellung besser zu verstehen. Hier haben wir eine Klasse namens Deserts
mit der Funktion desert()
darin.
Im main
-Block definieren wir einen Pointer d
auf die Klasse Deserts
und verwenden dann den Punktoperator (.
) mit dem Pointer d
, um auf die Klassenmethode desert()
zuzugreifen. Aber wenn wir diesen Code ausführen, erhalten wir einen Fehler.
#include <iostream>
using namespace std;
class Deserts {
public:
void desert() { cout << "Have a cake!" << endl; }
};
int main() {
Deserts *d = new Deserts();
d.desert();
}
Ausgang:
In function 'int main()':
error: request for member 'desert' in 'd', which is of pointer type 'Deserts*' (maybe you meant to use '->' ?)
15 | d.desert();
| ^~~~~~
Dies geschieht aufgrund der falschen Verwendung des Punktoperators (.
). Lassen Sie uns kurz die Grundlagen des Punktoperators (.
) noch einmal durchgehen, um mehr Klarheit zu gewinnen.
der Punktoperator (.
) in C++
Der Punktoperator (.
) in C++ wird verwendet, um auf die Attribute und Methoden eines Objekts zuzugreifen. Mit anderen Worten, wir können sagen, dass es für die direkte Elementauswahl über den Objektnamen verwendet wird.
Syntax:
object_name.member_name;
Hier ist ein Beispiel, das zeigt, wie der Punktoperator (.
) in C++ funktioniert. Hier haben wir eine Struktur namens Wüste
mit zwei Mitgliedern.
Innerhalb des main
-Blocks erstellen wir ein Objekt d
und weisen den beiden Mitgliedern der Struktur Werte zu. Um nun die Werte der Mitglieder des Objekts d
auszugeben, verwenden wir den Punktoperator (.
), wie Sie in den Zeilen 12 und 13 sehen können.
So funktioniert im Wesentlichen der Punktoperator (.
) in C++.
Weitere Informationen zum Punktoperator (.
) in C++ finden Sie unter diesem Link.
#include <iostream>
using namespace std;
struct Desert {
int cookie, cake;
};
int main() {
struct Desert d = {10, 2};
cout << "Cookies present:" << d.cookie << endl; // use dot operator
cout << "Cakes present :" << d.cake << endl; // use dot operator
return 0;
}
Ausgang:
Cookies present:10
Cakes present :2
Denken Sie jetzt eine Minute nach, können Sie die Ursache des Fehlers im vorherigen Code erkennen? Wenn ja, dann ein dickes Lob an dich.
Wenn nicht, dann lies weiter!
Ursache des Ausdrucks Must Have Class Type Error in C++
Der Fehler Ausdruck muss Klassentyp haben
tritt auf, wenn der Punktoperator (.
), der normalerweise für den Zugriff auf die Mitglieder eines Objekts verwendet wird, auf einen Zeiger auf ein Objekt angewendet wird. Stellen Sie sich das so vor.
Sie verwenden den Punktoperator (.
) für einen Zeiger auf ein Objekt. Der Punkt-Operator (.
) versucht nun, wie er es normalerweise tut, die Zeigerelemente (Felder oder Methoden) zu finden.
Es ist allgemein bekannt, dass ein Objekt auf eine Klasse und ein Zeiger auf eine Klasse zwei verschiedene Dinge sind. Wenn wir ein Objekt für eine Klasse erstellen, werden die Klassenmitglieder auch Teil des Objekts, aber das passiert nicht, wenn wir einen Zeiger auf eine Klasse definieren.
Können wir also sagen, dass der Zeiger versucht, etwas zu finden, das gar nicht existiert?
Absolut ja, und deshalb bekommen wir den Fehler.
Behebung des Fehlers Ausdruck muss Klassentyp haben
in C++
Wir können den expression must have class type error
in C++ auf zwei Arten beheben. Lassen Sie uns sie einzeln besprechen.
Initialisieren Sie das Objekt ohne die Verwendung des New-Operators, um den Klassentypfehler in C++ zu beheben
Wenn wir den new
-Operator verwenden, um ein Objekt zu initialisieren, verwenden wir einen Zeiger, wie unten gezeigt.
class *object = new class();
Die erste Möglichkeit, die wir haben, besteht also darin, den Zeiger zu entfernen, indem wir das Objekt initialisieren, ohne den Operator new
wie folgt zu verwenden:
class object;
Lassen Sie uns nun den problematischen Code mit dieser Änderung erneut ausführen. Dieses Mal instanziieren wir das Objekt, ohne den Operator new
zu verwenden, und der Code läuft einwandfrei.
#include <iostream>
using namespace std;
class Deserts {
public:
void desert() { cout << "Have a cake!" << endl; }
};
int main() {
Deserts d; // Instantiate the object without using the new operator
d.desert();
}
Ausgang:
Have a cake!
Aber jetzt fragen Sie sich vielleicht, ob die Instanziierung eines Objekts ohne Verwendung des Operators new
überhaupt richtig ist. Nun, es ist.
Wenn wir den Operator new
verwenden, um ein Objekt zu initialisieren, bleibt es im Speicher, bis wir es löschen. Wenn wir jedoch den new
-Operator nicht verwenden, wird das Objekt zerstört, wenn es den Gültigkeitsbereich verlässt.
Somit können Sie je nach Bedarf entscheiden, ob Sie den neuen
Operator verwenden möchten oder nicht. Denken Sie jedoch daran, dass bei Verwendung des Operators new
die Verwendung des Operators Punkt (.
) für den Zugriff auf die Objektmitglieder einen Fehler verursacht.
In diesem Fall sollten Sie den Pfeiloperator (->
) anstelle des Punktoperators (.
) verwenden, wie im folgenden Abschnitt beschrieben.
Verwenden Sie den Pfeiloperator (->
), um den Klassentypfehler in C++ zu beheben
Der Pfeiloperator (->
) wird verwendet, um mit einem Zeiger auf die Mitglieder eines Objekts zuzugreifen. Mit anderen Worten, der Pfeiloperator (->
) wird für die indirekte Elementauswahl über einen Zeiger verwendet.
Wenn wir also den Operator new
verwenden, um ein Objekt zu instanziieren, sollten wir den Punktoperator (.
) nicht wie folgt verwenden:
pointer_to_object.class_member;
Da es sich um einen Zeiger handelt, sollten wir stattdessen den Pfeiloperator (->
) wie folgt verwenden:
pointer_to_object->class_member;
Lassen Sie uns diese Änderung am problematischen Code vornehmen und erneut ausführen. Sie können sehen, dass der Code dieses Mal gut läuft.
#include <iostream>
using namespace std;
class Deserts {
public:
void desert() { cout << "Have a cake!" << endl; }
};
int main() {
Deserts *d = new Deserts();
d->desert(); // use arrow operator to access the object member via pointer
}
Ausgang:
Have a cake!
Beachten Sie, dass die Verwendung des Pfeiloperators (->
) nur eine Abkürzung für die folgende Notation ist:
(*pointer_to_object).class_member
Kannst du herausfinden, was das bedeutet?
Nun, da der Punktoperator (.
) für Objekte und Referenzen und nicht für Zeiger verwendet wird, muss zuerst der Zeigertyp dereferenziert werden, um die Referenz des Objekts zu erhalten. Dann können wir es zusammen mit dem Punktoperator (.
) verwenden, um auf die Objektmitglieder zuzugreifen.
Aber der bessere Weg, dies zu tun, ist die Verwendung des Pfeiloperators (->
), da er kurz und übersichtlich ist.
Um mehr über den Pfeiloperator (->
) in C++ zu erfahren, lesen Sie diese Dokumentation.
Abschluss
Dieser Artikel hat uns etwas über den Fehler Ausdruck muss Klassentyp haben
in C++ beigebracht. Wir haben besprochen, warum dieser Fehler auftritt und die verschiedenen Lösungen, um ihn zu beheben.