Kopier-Konstruktor aufrufen?!
-
Hallo liebe C++ Gemeinde. Ich bin ein Neuling in der Programmierung und auch neu im Forum.
Ich arbeitet zur Zeit mit dem IVT (Integrated Vision Toolkit). Und mache mit den Übungen auch Fortschritte. Bloß bei einem Problem komme ich nicht weiter. Ich muss eine Funktion aufrufen und bekomme es einfach nicht hin. Nach Recherche handelt es sich dabei um einen Kopierkonstruktor:class COpenGLCapture : public CVideoCaptureInterface { public: // constructors (); COpenGLCapture(const CCalibration &calibration); COpenGLCapture(const CStereoCalibration &stereoCalibration);(den dritten Konstruktor möchte ich aufrufen)
Wie rufe ich dies nun in meine main;-Funktion auf?? Ich habe schon alles mögliche Probiert und ich komme nicht weiter:
int main() { COpenGLCapture capture(stereoCalibration); }...klappt einfach nicht! 'Ich wäre wirklich sehr dankbar, wenn mir jemand helfen kann.
PS: Sollte der Topic nicht im richtigen Forum stehen, so möge man mir Verzeihen, ich dachte das passt hier am besten rein.
-
Wie äußert sich denn dieses "klappt nicht"? Und wo hast du das Objekt erzeugt, von dem du dort eine "Kopie" anlegen willst?
btw, rein technisch betrachtet sind das keine Kopier-Konstruktoren - ein Kopier-Konstruktor erzeugt eine Kopie von einem Objekt der selben Klasse, also
COpenGLCapture(const COpenGLCapture&);.
-
Ich habe "capture" garnicht erzeugt. Vorher war das Programm (welches auch lief) ein bisschen anders:
class COpenCVCapture : public CVideoCaptureInterface { public: // constructor COpenCVCapture(int nIndex, const char *pFilename = 0); // destructor ~COpenCVCapture();(...)
undint main() { COpenGLCapture capture(0,0); }...vorher hat es funktioniert doch ich benötige die calibrierung von OpenGL und nicht von OpenCV. Die Stuktur von den beiden ist sehr ähnlich:
[url]
http://ivt.sourceforge.net/doxygen/_open_g_l_capture_8cpp-source.html[/url]
und
http://ivt.sourceforge.net/doxygen/_open_c_v_capture_8cpp-source.htmlIch weiß, dass man eigendlich wesentlich fitter im Programmieren sein sollte, um solche Operationen durchzuführen. Ich dachte ich könnte das einfach analog vom originalen aufrufen.
Geht nicht bedeutet das VS2010 immer wieder div Fehler ausspuckt wie
"Verweise müssen initialisiert werden" oder
"Instanz von abstrakter Klasse kann nicht erstellt werden" usw....
-
Wie gesagt, du mußt erst ein CCalibration-Objekt (bzw. eine davon abgeleitete Klasse) anlegen - diese kannst du dann deinem Konstruktor übergeben. Um weitere Fehler zu diagnostizieren, solltest du den fehlerhaften Code und die exakte Meldung des Compilers hier posten.
(meine Kristallkugel ist atm zur Reparatur :D)
-
CStoll schrieb:
(meine Kristallkugel ist atm zur Reparatur :D)
Der Spruch kommt in jedem Thread mit so einer exakten Fehlerbeschreibung aber ich find trotzdem

-
Wenn das in jedem Thread kommt, wer kann denn dann endlich Mal Deine Kristallkugel reparieren?
Service-Urwald Deutschland oder wie war das.
-
Das sind zwei sog. "conversion constructor".
Und um sie aufzurufen musst du erstmal ein passendes Objekt haben, also einCStereoCalibrationoderCCalibrationObjekt.
Also z.B. so:void foo() { CStereoCalibration calib/*(eventuell, noetige, parameter)*/; COpenGLCapture cap(calib); }
-
Hallo Hustbaerleider funktioniert der Code nicht:
*c:\1a\ivt\examples\calibrationapp\src\organizer.cpp(76): error C2079: 'calib' verwendet undefiniertes class 'CStereoCalibration'
1>c:\1a\ivt\examples\calibrationapp\src\organizer.cpp(77): error C2259: 'COpenGLCapture': Instanz von abstrakter Klasse kann nicht erstellt werden
1> aufgrund folgender Member:
1> "void COpenGLCapture::DrawScene(void)": ist abstrakt
1> c:\1a\ivt\src\videocapture\openglcapture.h(97): Siehe Deklaration von 'COpenGLCapture::DrawScene'1>c:\1a\ivt\examples\calibrationapp\src\organizer.cpp(77): error C2664: 'COpenGLCapture::COpenGLCapture(const CCalibration &)': Konvertierung des Parameters 1 von 'int' in 'const CCalibration &' nicht möglich
1> Ursache: Konvertierung von 'int' in 'const CCalibration' nicht möglich
1> Quelle oder Ziel hat einen unvollständigen Typ*Ich habe auch conversion constructor gegoogelt, aber leider kein Beispiel mit Aufruf gefunden, welches meinem Problem entspricht.
-
Nochmal ausführlich:
Header:
class COpenCVCapture : public CVideoCaptureInterface { public: // constructor COpenCVCapture(int nIndex, const char *pFilename = 0); // destructor ~COpenCVCapture(); // public methods bool OpenCamera(); void CloseCamera(); bool CaptureImage(CByteImage **ppImages); int GetWidth(); int GetHeight(); CByteImage::ImageType GetType(); int GetNumberOfCameras() { return 2; } private: // private attributes CvCapture *m_pCapture; _IplImage *m_pIplImage; const int m_nIndex; std::string m_sFilename; }; #endif /* _OPEN_CV_CAPTURE_H_ */Konstruktor:
COpenGLCapture::COpenGLCapture(const CStereoCalibration &stereoCalibration) { m_nCameras = 2; width = stereoCalibration.width; height = stereoCalibration.height; type = CByteImage::eRGB24; m_pOpenGLVisualizer = new COpenGLVisualizer(); m_pStereoCalibration = new CStereoCalibration(); m_pCalibration = 0; m_pStereoCalibration->Set(stereoCalibration); }wie rufe ich jetzt das Ding auf?
-
Was ist denn an den Fehlermeldungen so schwer zu verstehen? Du hast ein Include vergessen und die Funktion DrawScene nicht implementiert.
-
ich glaube nicht, dasss das problem ist. OPenGL ist konsisten und richtig installiert.
Ich wie rufe ich die Funktion auf?
-
StephanKr schrieb:
ich glaube nicht, dasss das problem ist. OPenGL ist konsisten und richtig installiert.
Wer hat das bezweifelt?
-
... weil alles included und implementiert ist. Mann muss nur eine Headerdatei includen. in dieser stehen dann weiter und so weiter. Ich möchte doch nur wissen wie ihr diese Funktion aufrufen würdet???!!!
-
Tja, bei der Beratungsresistenz ist wohl Hopfen und Malz verloren ...
-
manni66 schrieb:
Tja, bei der Beratungsresistenz ist wohl Hopfen und Malz verloren ...

StephanKr schrieb:
... weil alles included und implementiert ist.
Was hat Inkludation mit Implementation zu tun?
Allgemein: Ich glaube, du kapierst nicht genau, was dein Problem ist. Du denkt es liegt am Copy-CTor und willst ein Beispiel. Bitteschön:
struct foo { foo(){}; foo(const foo& obj){*this = obj}; }; foo bar1; foo bar2(bar1);Und was hat dir das gebracht? hustbaer hat eine korrekte und auf deine Klasse spezifische Lösung angegeben. Wenn das nicht funzt, machst du definitiv selber etwas falsch.
-
1.Satzzeichen sind keine Rudeltiere.
2.COpenGLCapture ist eine abstrakte Klasse. Abstrakte Klassen kann man nicht instanzieren, d.h. den CTor nicht aufrufen. Lösung: Mach das es keine abstrake Klasse mehr ist - implementiere die Funktion
void COpenGLCapture::DrawScene(void)
Das hat manni66 dir auch schon gesagt.
3.COpenGLCapture braucht zur Konstruktion ein Objekt vom typ CCalibration oder CStereoCalibration. Die erste Zeile der Fehlemeldung sagt, dass diese Klassen nicht bekannt sind. Also hast du wohl ein inlcude vergessen. Auch das hat manni66 gesagt.
4.Werf mal die Vorstellung weg das du da irgendwie wüsstest was du tust. Du hast nämlich nicht wirklich Ahnung.
-
StephanKr schrieb:
c:\1a\ivt\examples\calibrationapp\src\organizer.cpp(76): error C2079: 'calib' verwendet undefiniertes class 'CStereoCalibration'
Dazu müsstest du den richtigen Header includen (der OpenGLCapture-Header hat nur eine Forward-Deklaration).
*1>c:\1a\ivt\examples\calibrationapp\src\organizer.cpp(77): error C2259: 'COpenGLCapture': Instanz von abstrakter Klasse kann nicht erstellt werden
1> aufgrund folgender Member:
1> "void COpenGLCapture::DrawScene(void)": ist abstrakt
1> c:\1a\ivt\src\videocapture\openglcapture.h(97): Siehe Deklaration von 'COpenGLCapture::DrawScene'
*Die Klasse ist abstrakt, also mußt du eine eigene Klasse von ihr ableiten und dort die DrawScene()-Methode mit Inhalt füllen.
(die COpenCVCapture-Klasse ist dagegen nicht abstrakt, dehalb kannst du sie auch problemloser verwenden)