neues Objekt in ein CArray?



  • Hallo!

    Ich habe eine Klasse CMessgPrisma die von CObject erbt (siehe unten). Deren Objekte sollen in einem CArray verwaltet werden. Ich habe dazu in meinem Dokument einen Member-Variable angelegt:

    CArray<CMessgPrisma, CMessgPrisma> m_prisma;
    

    In einer Funktion soll der folgende Code ausgeführt werden:

    ...
    
    //neue Messung erstellen
    CMessgPrisma NeueMessung;
    
    ...
    
    //Messung dem Feld hinzufügen
    m_prisma.Add(NeueMessung);
    
    ...
    

    Zwischendurch wird mit dem neuen Objekt noch einiges gemacht, das ist ja aber egal.

    Beim kompilieren kommt die Fehlermeldung:

    ...\DocPrisma.cpp(179) : error C2664: 'Add' : Konvertierung des Parameters 1 von 'class CMessgPrisma' in 'class CMessgPrisma' nicht moeglich
            Kein Kopierkonstruktor fuer class 'CMessgPrisma' verfuegbar
    

    Wie muß dieser Kopierkonstruktor aussehen bzw. wie bekomme ich so ein neues CMessgPrisma-Objekt in das CArray? 😕

    Ohne Ahnung davon zu habe ich es mit diesem Kopierkonstruktor probiert: :p

    class CMessgPrisma : public CObject  
    {
    private:
    	CWinkel m_WinkelLinks, m_WinkelRechts;
    	double m_Lambda;
    
    public:
    	CMessgPrisma(CMessgPrisma &h);
    
    	...
    };
    
    CMessgPrisma::CMessgPrisma(CMessgPrisma &h)
    {
    	m_WinkelLinks = h.m_WinkelLinks;
    	m_WinkelRechts = h.m_WinkelRechts;
    	m_Lambda = h.m_Lambda;
    }
    

    Der bringt dann aber der Kompiler den Fehler:

    c:\programme\microsoft visual studio\vc98\mfc\include\afxtempl.h(443) : error C2582: 'CMessgPrisma' : 'Operator =' ist nicht verfuegbar
            c:\programme\microsoft visual studio\vc98\mfc\include\afxtempl.h(1566) : Bei der Kompilierung der Member-Funktion 'void __thiscall CArray<class CMessgPrisma,class CMessgPrisma>::SetAtGrow(int,class CMessgPrisma)' der Klassenvorlage
    

    Bitte helft mir! In diversen Büchern steht nix. Und Google spuckt auch nichts vernünftiges aus. ⚠ BITTE! ⚠

    Strolli



  • Verwalte das mit CObArray. Das ist viel einfacher und komfortabler.
    Sieht ungefähr so aus:

    CObArray DeinArray;
    DeinArray.Add((CObject*)pDeinPrismaDingensObjekt);
    

    Und schon isses drin 😃
    Die Klasse bietet dann noch weitere Funktionen zum Objekte- einfügen, löschen
    usw



  • @Cpp_Junky
    Hab' aber gelesen, dass man in neuen Programmen lieber das CArray verwenden sollte. Dein CObArray verwaltet ja auch nur die Zeiger, ich würde jedoch gern die Objekte selber speichern.

    Ist es den wirklich so schwer sich so einen Kopierkonstruktor für mein Objekt auszudenken? Klär mich bitte auf!

    Strolli



  • Hi Strolli, nimm doch mal deinen Kopierkonstruktor ganz raus. Der Compiler generiert automatisch einen. Du musst eigentlich nur einen schreiben, wenn du mit dynamischen Speicher (new) handhabst. Sieht aber nicht so aus, als wäre es bei dir der Fall, weil du ja keine Zeiger als Membervariablen hast.



  • sorry. du hattest es ja erst ohne.

    kannst du das projekt mal irgendwo hochladen oder per mail verschicken? würde mir das gerne mal angucken, wenn ich darf. 😛



  • Kein Problem. Wohin soll ich es mailen? Hochladen geht auch ...



  • ja super. dann lad lieber hoch dann können auch noch andere mal gucken!! 😋



  • Also, als ZIP-Archiv unter http://www.mycgiserver.com/~strolli/O45.zip. Aber versucht bitte nicht das ganze Projekt zu kompilieren, das wird nix. 😃 Hab' noch diverse Änderungen vorgenommen die noch nicht überall eingearbeitet sind.

    Das mit dem CArray steht bisher nur in der Klasse CDocPrisma. Deren Interaktion mit der dazugehörigen View (CViewPrisma), CMessgPrisma und CWinkel klappt soweit fehlerfrei. Also nur die CPP-Datei von CDocPrisma kompilieren, dann müßte der Fehler reproduzeirbar sein.

    Danke!
    Strolli



  • Schade das man dein Projekt nicht vollständig kompilieren kann.

    Höchstwahrscheinlich liegt es an den konstanten Membervariablen. (hab da jetzt auf die schnelle nur const double pi entdeckt). Dann kann der Compiler nämlich keinen Copy-Constructor generieren.



  • Ne, sorry. Das war es doch nicht.

    Hab das zum Compilieren bekommen nach 1000 Änderungen 😉

    Es liegt irgendwie daran das du von CObject erbst.



  • Hab nochmal folgende Info gefunden:

    CObject makes the copy constructor and operator = private, so you can't
    do things like this...

    Also musst du entweder Copy-Konstruktor UND Zuweisungsoperator selbst schreiben oder du erbst einfach nicht von CObject, was wohl die bessere Wahl ist.



  • Von CObject würde ich schon erben - ich denke mal er braucht das später für Serialisierung.

    class CMessgPrisma : public CObject  
    {
    private:
    	CWinkel m_WinkelLinks, m_WinkelRechts;
    	double m_Lambda;
    public:
    	CMessgPrisma()
    	{
    		// Standardinit.
    	}
    	CMessgPrisma(const CMessgPrisma& src) :
    		m_WinkelLinks(src.m_WinkelLinks),
    		// ...
    	{}
    	operator =(const CMessgPrisma& src)
    	{
    		m_Lambda = src.m_Lambda;
    		// ...
    	}
    };
    

    /edit:

    Und nimm:
    [cpp]CArray<CMessgPrisma, CMessgPrisma/* --> /&> m_prisma;[/cpp]
    Sonst muss bei Add
    2x kopiert werden.


Log in to reply