List->Add() tiefe Kopie anhängen



  • Hi miteinander,

    vor ein paar Tagen hab ich mit C++/CLI angefangen und nun tauchen die ersten Problemchen auf.

    Ich habe einen Datentyp "cData" mit Initialisierungskonstruktor:

    ref class cData
    {
    public:
    	unsigned int uID;		//Unsere ID, wird automatisch incrementiert
    	String^ sTitel;			//Filmtitel
    	String^ sDirector;		//Director vom Film
    
    	cData(void);
    };
    

    Eine Klasse "cIMDB" mit List und cData als Member:

    ref class cIMDB
    {
    	WebClient^ Client;
    
    	String^ Search; //Beinhaltet einen korrekt formatierten String von dem Filmname
    	//Suchbegriff darf keine Leerzeichen beinhalten!! Beispiel: "Hangover" oder "The+Hangover+Wort" case insensitive!
    
    	cData^ FilmData;	//Hier werden alle Filminfos reingeparst 
    
    list<cData> FilmDataList;	//Hier werden absteigend alle Filminfos zu den rausgesuchten Links abgespeichert
    
    	List<String^>^ SearchLink; 
    
    	List<cData^>^ FilmDataList;
    
    public:
    	cIMDB(void);
    	cIMDB(String^ Suchbegriff);	//Eine Instanz der Klasse wird gebildet und mit einem Suchbegriff vorbelegt
    
    	bool fetchSearchResult(void);//Holt den Quellcode der HTML-Seite und speichert nach "SearchResult"
    
    };
    

    Der Konsturktor von cIMDB-Klasse:

    cIMDB::cIMDB(void)
    {
    	Client = gcnew WebClient;
    	Client->Headers->Add( "user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)" );
    	FilmData=gcnew cData;
    	SearchLink = gcnew List<String^>();
    	FilmDataList= gcnew List<cData^>();
    
    }
    

    Beide Klassen hab ich auf das notwendigste Reduziert.

    Die Situation ist so: In "FilmData" werden Daten reingeschrieben.
    Ich möchte nun an einer bestimmten Stelle im Code eine "tiefe Kopie" davon anfertigen und dieses Objekt meiner FilmDataList hinzufügen.

    Danach soll FilmData wieder mit Daten gefüttert werden um irgendwann wieder daraus ein Objekt zu bilden und der FilmDataList hinzuzufügen.

    Dabei hab ich versucht einen Kopierkonstruktor bei der Klasse cData hinzuzufügen um das neue Object wie folgt zu erzeugen:

    cData^ = gcnew cData(this->FilmData);
    

    Bei diesem Kopierkonstruktor von cData

    cData::cData(cData &C)
    {
    uID=C.uID;		//Unsere ID, wird automatisch incrementiert
    sTitel=C.sTitel;			//Filmtitel
    sDirector=C.sDirector;		//Director vom Film
    }
    

    bekomm ich allerdings die Fehlermeldung

    Fehler	1	error C3699: "&": Diese Referenzierung kann nicht für den Typ "cData" verwendet werden.	c:\users\windoof\documents\visual studio 2005\projects\p_filmverwaltung_imdb_final\p_filmverwaltung_imdb_final\cData.h	26
    

    So, wo liegt jetzt der Fehler? Hab ich ein allgemeines "StrukturProblem" oder verhau ich mich völlig mit den Zeigern?? Oder geh ich in die falsche Richtung? 😕

    Später hab ich noch die Methode "MemberwiseClone()" gefunden, aber da sagt mir der Compiler wird auch ein Kopierkonstruktor benötigt.



  • Okay, hab das Problem lösen können, allerdings versteh ich nicht wirklich wiso er das so haben möchte:

    cData.h

    void cData(cData^ C)
    

    und in der Cpp:

    uID=C->uID;
    sTitel=C->sTitel;
    //usw....
    

Anmelden zum Antworten