Frage zu Copy Konstruktor



  • Hi,
    Ich arbeite im Moment an meiner Physik Facharbeit und es ist ein Fehler aufgetaucht, bei dem ich Hilfe bräuchte.Der Fehler lautet folgendermaßen:

    c:\programme\microsoft visual studio\vc98\include\xmemory(34) : error C2558: class 'fa::Light' : Kein Kopierkonstruktor verfuegbar
    c:\programme\microsoft visual studio\vc98\include\xmemory(66) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __cdecl std::_Construct(class fa::Light *,const class fa::Light &)'

    Es ist also kein Kopierkonstruktor verfügbar. Ich dachte aber, dass ein Standard Kopier Konstruktor immer verfügbar ist. Die Klasse Light erbt von der Klasse Object. Der Fehler tritt auf wenn ich die Klasse Light in einen Vektor packe. Lege ich einen Copy Constructor wie folgt an

    fa::Light::Light( const Light &light ) : Object( light )
    {
    	(*this) = light;
    }
    

    funktionierts zwar, aber häää? Was solln das bringen? 😕
    Vielen Dank für alle Antworten



  • Zeig mal die Klasse Object



  • Klasse Objekt

    class Object
    	{
    	protected:
    		enum SelectState
    		{
    			NOT_SELECTED, //Nicht ausgewählt
    			MOUSE_DOWN,   //Maustaste über Objekt gedrückt
    			SELECTED	  //Objekt ausgewählt
    		};
    		//Objekt Position 
    		Point2Du m_pos;
    
    		//Alte Objekt Position
    		Point2Du m_oldpos;
    
    		//Zeiger auf Hauptklasse Window
    		Window *m_pwindow;
    
    		//Objekt ausgewählt
    		SelectState m_selected;
    
    		//Wann wurde Objekt ausgewählt
    		DWORD m_selectmoment;
    
    		//Kollision mit Greifpunkt ja/nein
    		bool m_collision;
    
    		//Die Größe des Greifpunktes
    		int m_gpsize;
    
    		//Objekt verändert?
    		bool m_changed;
    
    		//Objekt verschieben?
    		bool m_move;
    
    		//Soll der GraspPoint angezeigt werden
    		bool m_showgrasppoint;
    
    		//Überprüft ob das Objekt ausgewählt wird
    		Select();
    
    		//Überprüft auf Kollision mit dem Greifpunkt
    		bool Collision( Point2Du pos );
    
    		//Zeichnet den Punkt an welchem man das Objekt verschieben kann
    		DrawGraspPoint( bool clear );
    
    	    public:
    		Object( Window &pwindow );				
    		//Object( const Object &obj );
    
    		//Destruktor
    		~Object();
    
    		//Position des Objekts setzen
    		SetPos( Point2Du newpos );
    		SetPos( int nx, int ny );
    
    		//Objekt ausgewählt
    		bool IsSelected();
    
    		//Gibt die Zeit aus wann das Objekt ausgewählt wurde
    		DWORD GetSelectMoment(); 
    
    		//Ausgewählt von außerhalb setzen
    		SetSelectState( bool selected );
    
    		//Hier wird jedes Objekt gezeichnet
    		virtual Render();
    
    		//Hier wird auf Eingaben vom Benutzer reagiert
    		virtual React();
    
    	};
    


  • Ich dachte aber, dass ein Standard Kopier Konstruktor immer verfügbar ist

    Nur, wenn du selbst keinen Konstruktor definiert hast.



  • Ist denn dann der folgende Copy Konstruktor richtig?

    fa::Object::Object( const Object &obj)
    {
        (*this) = obj;
    }
    


  • interpreter schrieb:

    Ich dachte aber, dass ein Standard Kopier Konstruktor immer verfügbar ist

    Nur, wenn du selbst keinen Konstruktor definiert hast.

    ROFL



  • //edit



  • interpreter schrieb:

    Ich dachte aber, dass ein Standard Kopier Konstruktor immer verfügbar ist

    Nur, wenn du selbst keinen Konstruktor definiert hast.

    Ein Kopierkonstruktor wird immer erzeugt, wenn du keinen eigenen Kopierkonstruktor definierst.



  • Was mich zu der Frage zurückbringt, warum denn dann kein Kopier Konstruktor verfügbar ist, wenn ich keinen selber definiere( siehe ganz oben )?



  • Also Object sollte einen haben. Kannst du "Object a; Object b = a" schreiben? Wenn ja, liegt der Fehler immerhin nicht in Object. Geht das Gleiche mit Lights? Ist es ein vector<Object> (böse) oder ein vector<Light>?



  • Die Klasse Light wär an der Stelle wohl nicht ganz uninteressant, auf jeden Fall interessanter als Object.



  • Also folgendes, ohne eigenen Kopier Konstruktor

    fa::Object a,b;
    a = b;
    
    fa::Light c,d;
    c = d;
    

    ist möglich. Aber bei dem Vektor(ist ein std::vektorfa::Light) genauer gesagt bei der push_back funktion meckert er.



  • lool schrieb:

    interpreter schrieb:

    Ich dachte aber, dass ein Standard Kopier Konstruktor immer verfügbar ist

    Nur, wenn du selbst keinen Konstruktor definiert hast.

    ROFL

    Na Cico, wieder am trollen?



  • Bashar schrieb:

    interpreter schrieb:

    Ich dachte aber, dass ein Standard Kopier Konstruktor immer verfügbar ist

    Nur, wenn du selbst keinen Konstruktor definiert hast.

    Ein Kopierkonstruktor wird immer erzeugt, wenn du keinen eigenen Kopierkonstruktor definierst.

    Ja, genau das meinte ich. War vielleicht nicht genau genug ausgedrückt. 🙄



  • Nehm ich dir nicht ab, weil diese Aussage in dem Kontext Blödsinn wäre, aber egal, darum gehts ja nicht ...



  • Bashar schrieb:

    Nehm ich dir nicht ab, weil diese Aussage in dem Kontext Blödsinn wäre, aber egal, darum gehts ja nicht ...

    Gerade in dem Kontext war es sinnvoll. Dass es sich auf den Cpy-Ctor bezog, konnte man ja aus dem vorausgehenden Zitat folgern.



  • Du willst wohl gern Recht behalten, aber denk das nochmal im Kontext durch. EOD für mich.



  • Naja, is mir jetzt auch zu blöd rumzudiskutieren, nur weil ich es nicht 100%ig korrekt ausgedrückt habe.



  • Was mich zu der Frage zurückbringt, warum denn dann kein Kopier Konstruktor verfügbar ist, wenn ich keinen selber definiere( siehe ganz oben )?

    Object( Window &pwindow );
    

    Ist das denn keiner?

    Jeder Ctor mit einem Parameter der nicht explicit declariert ist ein CopyCtor.



  • Irgendwer schrieb:

    Jeder Ctor mit einem Parameter der nicht explicit declariert ist ein CopyCtor.

    Wow das wird ja immer besser hier ⚠

    Nein, ein Kopierkonstruktor der Klasse A ist ein Konstruktor mit einem Parameter vom Typ "Referenz auf A" oder "Referenz auf konstantes A" (12.1p10)



  • Kaasbrot schrieb:

    Also folgendes, ohne eigenen Kopier Konstruktor

    fa::Object a,b;
    a = b;
    
    fa::Light c,d;
    c = d;
    

    ist möglich.

    Du bringst ja auch überhaupt keinen copy ctor ins Spiel. Nochmal zur Verdeutlichung:

    foo a; // default ctor
    a = b; // Zuweisungsoperator (op=)
    foo a = b; // copy ctor
    

    Um deinen Fehler zu spezifizieren, müssen wir deine Light Klasse kennen.
    Ich vermute, dein Problem liegt darin, dass du keinen default ctor (ctor ohne Parameter) in Object definiert hast. Diesen erzeugt dein Compiler zwar automatisch, aber nur, wenn du keinen ctor selbst definiert hast.


Anmelden zum Antworten