kein passender Konstruktor vorhanden ist, um konvertieren aus "test *", "test", der Konstrukteur,
Ich bin neu c++
und ich habe Schwierigkeiten mit Konstruktor und Klassen. So, hier ist meine header-Datei:
#pragma once
#include <string>
using namespace std;
class test
{
private:
string name;
int number;
public:
test();
test(string i,int b);
};
Dies ist cpp-Datei:
#include "test.h"
#include <string>
using namespace std;
test::test(){}
test::test(string i,int b){
this->name=i;
this->number=b;
}
nun, wenn ich versuche zu nennen,
test t=new test("rrr",8);
Bekomme ich:
1 IntelliSense: no suitable constructor exists to convert from "test *" to "test"
Also, was ist die Sache mit Klassen mit *
in Ihrem Namen ( zum Beispiel Klassen ohne .cpp-Datei, die nicht über asterix, für alle anderen tun)? Und was mache ich falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, du kommst aus einer Java - /C# - hintergrund.
t
ist nicht eine Referenz geben Sie hier, es ist ein Wert-Typ.new
gibt einen Zeiger auf ein Objekt. So müssen Sie eine der folgenden Optionen:Wenn Sie noch nicht vertraut mit Zeiger, dann auf jeden Fall nicht die Letzte! Aber das Verständnis der Semantik von Zeigern ist ziemlich kritisch; ich empfehle die Lektüre der relevanten Kapitel(s) in Ihrem lehrbuch...
Müssen Sie auf jeden Fall lernen, über Zeiger.
test *
undtest
sind zwei völlig unterschiedliche Typen in C++. Hier sind zwei Variablen mit diesen Typen:Hier
t
Typtest
, undp
als Typtest*
. Wir beschreibentest*
als "Zeiger auftest
".Können Sie denken oft von einem Zeiger die Speicheradresse eines Objekts. So in
p
, denn es ist ein Zeiger, könnten wir speichern die Speicher-Adresse vont
, das ist eintest
. Um die Adresse eines Objekts, verwenden wir das unäre&
Betreiber, etwa so:Beachten Sie, dass
t
ist einetest
Objekt. Sie brauchte nicht zu sagennew test()
. Dies ist, wo C++ unterscheidet sich von anderen Sprachen, die Sie möglicherweise verwendet haben, wie C# und Java. Im obigen C++ - codet
ist eintest
Objekt.Jedoch, Sie kann erstellen von Objekten mit
new test()
, also, was ist der Unterschied?test t;
schafft einetest
Objekt mit automatischer Speicherung Dauer. Dies bedeutet, es zerstört am Ende seiner Geltung (oft die Funktion deklariert).new test()
schafft einetest
Objekt mit dynamic storage duration. Dies bedeutet, dass Sie das Objekt löschen, manuell, ansonsten haben Sie ein Speicherleck. Dieser Ausdruck gibt einen Zeiger und so können Sie initialisieren Sie einen Zeiger-Objekt mit:So, jetzt schauen wir uns Ihr problem:
Wissen wir jetzt, dass
new test("rrr", 8)
gibt einen Zeiger auftest
(atest*
). Aber Sie versuchen es zu einem assigntest
Objekt. Sie können einfach nicht tun. Einer von Ihnen ist eine Adresse, und der andere ist eintest
. Damit der compiler sagt "kein passender Konstruktor vorhanden ist, um konvertieren vontest *
zutest
." Macht Sinn, jetzt, nicht wahr?Stattdessen sollten Sie lieber verwenden Sie die automatische Speicherung Dauer. Verwenden Sie nur
new
wenn Sie wirklich, wirklich brauchen, um. So einfach tun:muss
*
wird verwendet, um anzuzeigen, dass ein Zeiger, es ist nicht der name der Klasse. Aber es ist ein großes Thema, so sollten Sie einige reseach auf dieser.*
ist nicht Teil des namens, es ist ein modifier, das kennzeichnet, dass das Objekt einen Zeiger. Ein Zeiger ist eine variable halten-Adresse an eine andere Stelle im Speicher, wo das Objekt gespeichert ist. Einige Grundlagen:int * pI
bedeutet, dass Sie wollen, um einen Zeiger zu deklarieren, um Platz im Speicher, wo ein int statt.&i
bedeutet, dass Sie wollen, um einen Zeiger auf die variable. So, jetzt pI hält die Adresse im Speicher, wo ich gespeichert. Jetzt können Sie dereferenzieren einen Zeiger zu dem Wert des Zeigers:Nun sagen Sie dem compiler, dass es gehen soll, um die Adresse verwies auf die von pI und abrufen Ihrer Inhalte (da pI ist ein Zeiger auf int, der compiler davon aus, dass es ein int ist es).
Nun, zurück zu deinem Beispiel.
new
Betreiber reserviert Speicher dynamisch zu einem Objekt, also:Ergebnisse in die Zuteilung von Speicher für eine test-Klasse, ruft deren Konstruktor mit Parametern, "rrr" und 8 und die Rückgabe einen Zeiger auf zugewiesenen Speicher. Das ist, warum Sie nicht zuordnen
test
variable: new-operator in diesem Fall gibt einetest *
.Versuchen, diesen code:
Sie nicht definieren
t
als Zeiger:Oder nur
Wenn neu ist in diesem Objekt Bau, es bezeichnet die Schaffung eines Zeigers. Was tun, ist die dynamische Zuweisung von Speicher, die ich bin sicher, dass Sie nicht bedeuten, zu tun. Die Eher typischen stack reservierte Objekt Bau fertig ist einfach so:
Selbst wenn Sie beabsichtigt hatte, auf die Schaffung eines Zeigers und Zuweisung von Speicher, du hast es in die falsche Richtung. Ein Zeiger wird erstellt, mit der
*
symbol, das Sie fehlte in deinem code. Zweitens, wenn du fertig bist mit dem Speicher, den Sie erstellt haben, müssen Sie daran denkendelete
/delete[]
code.delete[]
wird auf dynamisch zugewiesenen arrays. Das ist also, wie würde es Aussehen für den Mauszeiger: