C++ Nicht aufrufen Konstruktor '' direkt
Arbeite ich an einigen OpenCV code und entwickelt es in VS 2008 auf windows. Ich versuche den code auszuführen, der unter Linux mit g++, aber ich bekomme die Fehlermeldung "Cannot call constructor 'ImageProcessor::ImageProcessor "direkt" für ImageProcessor und alle anderen Klassen die ich erstellt habe. Ich habe versucht, einen Weg zu finden, um indirekt den Konstruktor aufrufen, aber ohne Erfolg. Jeder Vorschlag wäre toll. Der code wird kompiliert und läuft einwandfrei auf Windows.
if (x == 1){
cout <<"MODE SELECTED: IMAGE TESTING \n";
ImageProcessor* IP = new ImageProcessor;
LaneDetector* LD = new LaneDetector;
LaneInfo* LI1 = new LaneInfo;
LaneInfo* LI2 = new LaneInfo;
LaneVector* LV = new LaneVector;
cvNamedWindow("Window",CV_WINDOW_AUTOSIZE);
IplImage* temp = 0;
IplImage* img0 = 0;
img0 = cvLoadImage(PICTURE_INPUT);
CvRect r = cvRect(0,((img0->height)/3),img0->width,((img0->height)/3)+20);
cout <<"IMG0 LOADED \n";
while(1){
IP->ImageProcessor::ImageProcessor(img0, r);
temp = IP->ImageProcessor::get_processed_image();
LD->LaneDetector::LaneDetector(temp,r);
LD->LaneDetector::find_edges();
LI1 = LD->LaneDetector::find_lanes(5);
LI2 = LD->LaneDetector::find_lanes(25);
LV->LaneVector::LaneVector(LI1,LI2);
LV->LaneVector::print_lane_angle_info();
if( (cvWaitKey(20) & 255) == 27 ) break;
cvShowImage("Window", temp);
hold(1);
}
}
Bitte liefern Sie die Erklärung für
Sie müssen uns nur sagen, wo der Fehler Auftritt und wie Ed sagt, was bedeutet ImageProcessor Aussehen? Die erste Zeile in der while-Schleife sieht seltsam für mich.
C++ funktioniert anders als das. Starten Sie mit einem guten Buch.
¤ In C++ Variablen nicht
ImageProcessor
Sie müssen uns nur sagen, wo der Fehler Auftritt und wie Ed sagt, was bedeutet ImageProcessor Aussehen? Die erste Zeile in der while-Schleife sieht seltsam für mich.
C++ funktioniert anders als das. Starten Sie mit einem guten Buch.
¤ In C++ Variablen nicht
new
-ed, es sei denn, Sie möchten eine beliebige Lebensdauer. Einfach eine variable deklarieren, die v
Typ T
als T v;
. Für Ihre image-Prozessor-Objekt, deklarieren Sie die variable in der Schleife, wie ImageProcessor ip( img0, r );
. Das ist alles neu die genannten problem. Aber darüber hinaus sollten Sie unterlassen GROßBUCHSTABEN verwenden, Variablennamen. Reserve dass für die makro-Namen. Cheers & hth., und machen sich selbst ein gutes C++ Anfänger Buch!,
InformationsquelleAutor Wade G | 2012-02-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser code ist schrecklich.
Warum sind Sie die Qualifikation jedes Mitglied Funktion?
Und Nein, Sie können nicht rufen Sie einen Konstruktor auf einem bereits erstellten Objekt. Jeder Konstruktor-Parameter sollte beim initialisieren Sie das Objekt (die Ihr code wird mit
new
, was auch nicht gut ist C++ coding style). Wenn diese Argumente sollen nicht bereitgestellt werden, bis lange nach dem Bau, ändern Sie die "Konstruktor" in eine normale member-Funktion mit einem entsprechenden Namen.Dein code hat zahlreiche memory leaks auch. Es sieht aus wie Sie, Sie schreiben Java-code in C++ - syntax. Ist das nicht eine gute Sache.
Warum nicht verschieben, die eine Antwort auf die Kommentar - Abschnitt-es ist schließlich nur Kommentar?
Meine Antwort richtig ist. Sie können ein neues Objekt erstellen Wiederverwendung der gleichen Speicher, aber das ist ein neues Objekt. Und "ändern Sie den Konstruktor in eine normale member-Funktion" ist eine Lösung für das problem.
Ich habe Ihnen schon gesagt, dass Ihr, äh, der Kommentar, ist falsch. Dass jemand wie ich Ihnen erzählen, dass sollte genug sein, um Sie gehen auf der Suche für, wie zu tun, was Sie sagen kann nicht getan werden. Wie es passiert, würden Sie nicht gehabt haben, um zu suchen mehr als einfach nur Lesen dieser Seite in vollem Umfang. Cheers & hth.,
Ich weiß ganz genau über die Platzierung
new
. Es NICHT, rufen Sie einen Konstruktor für ein Objekt, das bereits vollständig aufgebaut. Es erstellt ein neues Objekt in den gleichen Speicherbereich. Die alte Objekt-Lebenszeit endet, wenn der Speicher wiederverwendet wird. Ich kann zitieren Sie Kapitel-und vers-aus dem Standard, wenn Sie möchten.InformationsquelleAutor Ben Voigt
Dieser code ist ziemlich seltsam, Rekonstruktion
IP
jedes mal durch die Schleife, die oben auf einem vorhandenen Objekt?Nicht sicher, ob die syntax
war immer gültig. Vielleicht in sehr alten C++. Der normale Weg, dies zu tun ist,
Nicht sagen, es ist eine gute Idee, aber ich denke, es wird das gleiche tun.
Bitte nicht schlagen Platzierung
new
. Ich denke, Sinn der Sache wäre eine lokale non-Zeiger-variable den Gültigkeitsbereich innerhalb der Schleife.Naja, ich würde nicht sagen, ich war
IP->
Konstruktor, ich vermute, das ist, was es tut. Aber ich würde nie verteidigen, die ganze Sache; es ist sehr komisch und ich kann es nicht wirklich begründen, warum jemand würde etwas schreiben wie dieses. Aber, dann habe ich keinen hintergrund in der VS und ich sehe, VS-snippets die ganze Zeit, dass das komisch Aussehen (obwohl nicht ganz das seltsam.)die OP ist die syntax war noch nie gültig. 🙂
InformationsquelleAutor smparkes