Eigene Objekte, Copy-Konstruktoren und ihre Komplikationen



  • Hallo ihr Profis,

    ich habe ein Problem mit selbst erstellten Klassen.

    Ich muss über eingene Klassen Objekte erstellen. Diese müssen in einem Vector gespeichert werden. Da sie dazu kopiert werden, muss ein Copy-Constructor eingesetzt werden. so weit- so gut. Die .h-Datei sieht in etwa folgendermassen aus:

    class CMetricObjects : public CObject
    {
    
    public:
    	CMetricObjects();
    	CMetricObjects(int x, int y);	//Konstruktor für Punkte
    	CMetricObjects(const CMetricObjects& cmo); 	  // Copy constructor
    
    	virtual ~CMetricObjects();
    
    	  // Assignment operator
    	CMetricObjects& operator=(const CMetricObjects& )
    	{
    		return *this;
    	};
    
    //protected:
    	CPen pen;
    	CBrush brush;
    	CPoint StartPoint;
    	CPoint EndPoint;
    	CString typ;
    };
    

    Die .cpp-Datei sieht in Ausschnitten so aus:

    #include "MetricObjects.h"
    
    [...]
    
    //Konstruktor für Punkte
    CMetricObjects::CMetricObjects(int x, int y)
    {
    	typ = "Punkt";
    
    	pen.CreatePen(PS_SOLID, 2, RGB(255,0,0));
    
    	StartPoint.x = x - 10;
    	StartPoint.y = y + 10;
    
    	EndPoint.x = x + 10;
    	EndPoint.y = y + 10;
    
    }
    
    [...]
    
    // Copy constructor
    CMetricObjects::CMetricObjects(const CMetricObjects& cmo)
    {
    	EXTLOGPEN extlogpen;
    
    	cmo.pen.GetExtLogPen(&extlogpen);
    
    	pen.CreatePen(extlogpen.elpPenStyle, extlogpen.elpWidth, extlogpen.elpColor);
    
    	StartPoint.x = cmo.StartPoint.x;
    	StartPoint.y = cmo.StartPoint.y;
    
    	EndPoint.x = cmo.EndPoint.x;
    	EndPoint.y = cmo.EndPoint.y;
    }
    

    Die Punkte aus dem kopierten Objekt cmo auszulesen ist überhaupt kein Problem.
    Wenn ich den Pen mittels GetExtLogPen(...) auslesen will kommt folgende Fehlermeldung:

    e:\Dateien\c++\VS.NET\Metric\MetricObjects.cpp(57): error C2662: 'CPen::GetExtLogPen': this-Zeiger kann nicht von 'const CPen' in 'CPen &' konvertiert werden
    

    Kann mir jemand helfen, ich muss dringend den Pen übergeben, damit die Objekt in der dem entsprechenden Farbe gezeichnet werden können.
    Das gleiche Problem wird sich ja mit dem Brush ergeben.

    Dank schon im Voraus.

    Christian



  • hast du hier mit der methodenliste gearbeitet wo du das

    cmd.pen.getextlogpen()
    geschrieben hast?

    kann es sein du musst ein -> verwenden??



  • hallo,

    ja. da ich unter VS.NET 2003 arbeite, kommt ja die intellisense-db zum einsatz.
    diese bringt mir auch die codecompletion und bietet mir die funktion an.

    mit -> geht gar nix.
    da bringt gleich die intellisense einen fehler und wenn ich's kompilieren will, kommen auch fehler, die ich aber jetzt nicht aufschreiben kann, da ich nicht mehr auf der arbeit bin.

    mfg
    christian



  • Welche Zeile ist denn die 57?



  • eben jene mit:

    cmo.pen.GetExtLogPen(&extlogpen);



  • MSDN:

    Compiler-Fehler C2662
    'Funktion' : 'this'-Zeiger kann nicht von 'Typ1' in 'Typ2' konvertiert werden

    Der Compiler konnte den Zeiger this nicht von Typ1 in Typ2 konvertieren.

    Dieser Fehler wird möglicherweise dadurch hervorgerufen, daß eine Member-Funktion (die nicht const ist) auf einem Objekt (das const ist) aufgerufen wird. Um dieses Problem zu beheben, entfernen Sie const aus der Objektdeklaration, oder fügen Sie const zu einer Member-Funktion hinzu.

    Ein Beispiel für diesen Fehler:

    class C
    {
    public:
    void func1();
    void func2() const;
    } const c;

    void main()
    {
    c.func1(); // Fehler
    c.func2(); // Kein Fehler
    }

    Lass doch mal das const in der Deklaration und bei der Implementierung des Copykonstruktors weg.



  • tja, leider erkennt er dann den Copy-Konstruktor nicht mehr.
    dieser benötigt dringend den const.

    Es kommt folgende Fehlermeldung:

    d:\Programme\Microsoft Visual Studio .NET 2003\Vc7\include\vector(810): error C2558: class 'CMetricObjects': Kein Kopierkonstruktor verfügbar oder der Kopierkonstruktor is als 'explicit' deklariert

    kurioserweise wird zeile 810 der vector - datei angeführt. dort befindet sich die funktion:
    void _Insert_n(iterator _Where, size_type _Count, const _Ty& _Val)
    {
    _Ty _Tmp = _Val; // <- ist Zeile 810

    [...]
    }



  • Jaja, das übliche MFC-Problem 🙄
    Da CPen::GetExtLogPen (leider) nicht als const markiert ist (obwohl sie eigentlich nur liest und nichts an dem CPen verändert), kannst du die Funktion nicht ohne Weiteres verwenden.
    Entweder, du machst erst einen const_cast, um das const von cmo zu entfernen, oder du nimmst ::GetObject(cmo.pen.m_hPen, sizeof(LOGPEN), &mylogpen).
    Dass der Compiler den Fehler an einer so komischen Stelle meldet liegt einfach daran, dass das die Stelle ist, an der er den Copy-CTor aufruft.



  • einfach nur genial !!! 😃

    Vielen Dank. Ich habe es dann mit dem zweiten Weg (GetObject) gemacht und das funktioniert hervorrangend.

    Nochmals herzlichen Dank !


Anmelden zum Antworten