Ich bin neu bei c++
und habe Schwierigkeiten mit Konstruktor und Klassen. Also, hier ist meine Header-Datei:
Dies ist cpp-Datei:
%Vor%jetzt, wenn ich versuche
anzurufen %Vor%Ich bekomme:
%Vor% Also, was ist die Sache mit Klassen, die *
in ihrem Namen haben (zum Beispiel, Klassen ohne .cpp Datei haben kein Asterix, alle anderen tun)? Und was mache ich falsch?
Ich kann mir vorstellen, dass Sie von einem Java / C # -Hintergrund kommen. t
ist hier kein Referenztyp, es ist ein Werttyp. new
gibt einen Zeiger auf ein Objekt zurück. Du brauchst also eines der folgenden Dinge:
Wenn Sie mit Zeigern noch nicht vertraut sind, verwenden Sie definitiv nicht die letzte! Aber das Verständnis der Semantik von Zeigern ist ziemlich kritisch; Ich empfehle Ihnen, die entsprechenden Kapitel in Ihrem Lehrbuch zu lesen ...
Also, was ist die Sache mit Klassen, die "*" in ihrem Namen haben (zum Beispiel, Klassen ohne .cpp-Datei haben kein asterix, alle anderen tun) ???
Sie müssen unbedingt über Zeiger lernen. test *
und test
sind zwei völlig unterschiedliche Typen in C ++. Hier sind zwei Variablen mit diesen Typen:
Hier hat t
den Typ test
und p
den Typ test*
. Wir beschreiben test*
als "Zeiger auf test
".
Sie können sich einen Zeiger oft als die Speicheradresse eines Objekts vorstellen. Also in p
, da es ein Zeiger ist, könnten wir die Speicheradresse von t
speichern, was ein test
ist. Um die Adresse eines Objekts zu erhalten, verwenden wir den unären Operator &
wie folgt:
Beachten Sie, dass t
ein Objekt test
ist. Du musst nicht new test()
sagen. Hierunter unterscheidet sich C ++ von anderen Sprachen, die Sie möglicherweise verwendet haben, wie C # und Java. Im obigen C ++ Code ist t
ein test
Objekt.
Allerdings können Sie Objekte mit new test()
erstellen, also was ist der Unterschied?
test t;
erstellt ein Objekt test
mit automatischer Speicherdauer. Dies bedeutet, dass es am Ende seines Geltungsbereichs zerstört wird (oft wird die Funktion innerhalb deklariert).
new test()
erstellt ein Objekt test
mit dynamischer Speicherdauer. Das bedeutet, dass Sie das Objekt manuell zerstören müssen, da sonst ein Speicherleck entsteht. Dieser Ausdruck gibt einen Zeiger zurück, und Sie können damit ein Zeigerobjekt initialisieren:
Sehen wir uns nun Ihr Problem an:
%Vor% Wir wissen jetzt, dass new test("rrr", 8)
einen Zeiger auf test
(a test*
) zurückgibt. Sie versuchen jedoch, es einem test
-Objekt zuzuweisen. Du kannst das einfach nicht tun. Einer von ihnen ist eine Adresse und der andere ist ein test
. Daher sagt der Compiler: "Es gibt keinen passenden Konstruktor, der von test *
in test
konvertiert werden kann." Macht jetzt Sinn, nicht wahr?
Stattdessen sollten Sie die automatische Speicherdauer bevorzugen. Verwenden Sie new
nur dann, wenn Sie es wirklich brauchen. Also mach einfach:
muss
sein %Vor%Also, was ist mit Klassen, die "*" in ihrem Namen haben?
*
wird verwendet, um einen Zeiger anzugeben, der nicht im Namen der Klasse steht. Aber es ist ein großes Thema, also sollten Sie etwas darüber nachdenken.
*
ist nicht Teil des Namens, es ist ein Modifikator, der angibt, dass das Objekt ein Zeiger ist. Ein Zeiger ist eine Variable, die eine Adresse an einer Stelle im Speicher hält, an der das tatsächliche Objekt gespeichert ist. Einige Grundlagen:
int * pI
bedeutet, dass Sie einen Zeiger deklarieren möchten, der im Speicher abgelegt wird, wo ein int gehalten wird. &i
bedeutet, dass Sie einen Zeiger auf die Variable abrufen möchten. So hält nun pI die Adresse im Speicher, wo ich gespeichert bin. Jetzt können Sie Dereferenzierung einen Zeiger - erhalten Sie den Wert des Zeigers:
Nun sagen Sie dem Compiler, dass er zu der Adresse gehen soll, auf die pI zeigt, und seinen Inhalt abrufen (da pI ein Zeiger auf int ist, nimmt der Compiler an, dass dort ein int ist).
Nun zurück zu deinem Beispiel. new
operator weist Speicher dynamisch für ein Objekt zu, also:
bewirkt die Zuweisung eines Speichers für die Testklasse, den Aufruf seines Konstruktors mit den Parametern "rrr" und 8 und das Zurückgeben eines Zeigers auf den zugewiesenen Speicher. Deshalb können Sie es nicht der Variablen test
zuweisen: Der neue Operator gibt in diesem Fall test *
zurück.
Probieren Sie diesen Code:
%Vor%Wenn new in dieser Objektkonstruktion verwendet wird, bezeichnet es die Erstellung eines Zeigers. Was passiert, ist die dynamische Speicherzuweisung, die Sie sicher nicht machen wollten. Die Eher, typische Stack zugewiesene Objektkonstruktion wird einfach so gemacht:
%Vor% Selbst wenn Sie einen Zeiger erstellen und den Speicher zuweisen wollten, haben Sie es falsch gemacht. Ein Zeiger wird mit dem Symbol% co_de% erstellt, das in Ihrem Code nicht vorhanden war. Zweitens: Wenn Sie den von Ihnen erstellten Speicher nicht mehr verwenden, müssen Sie sich an *
/ delete
Ihres Codes erinnern. delete[]
wird für dynamisch zugewiesene Arrays verwendet. So würde es nach deinem Zeiger aussehen:
Tags und Links c++ constructor pointers object instance