Es gibt keinen geeigneten Konstruktor, der von "test *" in "test", Konstruktor, konvertiert werden kann.

7

Ich bin neu bei c++ und habe Schwierigkeiten mit Konstruktor und Klassen. Also, hier ist meine Header-Datei:

%Vor%

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?

    
klo 26.03.2013, 12:52
quelle

6 Antworten

21

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:

%Vor%

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 ...

    
Oliver Charlesworth 26.03.2013, 12:54
quelle
5
  

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:

%Vor%

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:

%Vor%

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:

%Vor%

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:

%Vor%     
Joseph Mansfield 26.03.2013 12:59
quelle
2
%Vor%

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.

    
Kiril Kirov 26.03.2013 12:54
quelle
1

* 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:

%Vor%

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:

%Vor%

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:

%Vor%

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%     
Spook 26.03.2013 12:58
quelle
0

Sie haben t nicht als Zeiger definiert:

%Vor%

Oder nur

%Vor%     
bash.d 26.03.2013 12:55
quelle
0
%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:

%Vor%     
0x499602D2 26.03.2013 12:57
quelle