CStringArray operator= und copy constructor



  • Hi an alle,

    ich stehe im moment vor einem Problem und die MFC
    kann mir, soweit ich das überblicke, nicht weiterhelfen.

    Ich habe eine Klasse CFunction, in dem die Funktion OpenFile liegt,
    diese Funktion rufe ich in einem Dialog auf und zwar so:

    m_strArray = func.OpenFile("A-010704.a00");
    

    in der Funktion OpenFile sieht es dann so aus:

    CStringArray OpenFile(CString strFileName)
    {
    	CStringArray m_strArray; 
    	CString strText; 
    
    	CStdioFile file; 
    
    	if (file.Open(strFileName, CFile::modeRead)) 
    	{ 
    		while (file.ReadString(strText))
    		{
    			m_strArray.Add(strText); 
    		}
    		file.Close(); 
    	}
    	return m_strArray;
    }
    

    soweit, so gut, jedoch habe ich es nicht drauf, eine Funktion
    operator= dafür zu schreiben, da ich nicht weiß, wie ich so vorgehen muss.

    Weiterhin zeigt mir der Compiler die Fehlermeldung:

    class 'CStringArray' : no copy constructor available

    und da stehe ich genauso wie ein Ochs vor dem Berg.
    Also, ich hoffe mir kann jemand helfen.

    Danke im voraus!



  • CStringArray scheint keinen CopyKonstruktor zu haben...

    Warum nimmst du nicht einfach einen std::vector<CString> ?



  • Der CStringArray ist bereits fester bestandteil,
    meines Programms, habe ich quasi eingeplant.
    Ist von den Funktionalitäten auch genau das, was
    ich brauche, jedoch hakt es im mom an den zwei Problemen,
    wenn die gelöst sind, werden mir andere Tore geöffnet. (oder Probleme, wer weiss)

    Mit dem vector komme ich nicht klar, bleibe daher bei CStringArray.



  • Dann würde ich der Funktion eine Referenz auf ein CStringArray übergeben:

    void OpenFile(CStringArray& strarray,CString strFileName)
    {
        CString strText;
    
        CStdioFile file;
        if (file.Open(strFileName, CFile::modeRead))
        {
            while (file.ReadString(strText))
            {
                strarray.Add(strText);
            }
            file.Close();
        }
    }
    

    Devil



  • Klappt leider nicht, oder ich mache etwas falsch!

    CStringArray m_strArray;
    func.OpenFile(m_strArray, "A-010704.a00");
    

    Dann zeigt er mir folgenden Fehler an:

    error C2664: 'OpenFile' : cannot convert parameter 1 from 'class CStringArray *' to 'class CStringArray &'
    A reference that is not to 'const' cannot be bound to a non-lvalue

    Kannst du mir da noch weiter helfen, initialisiere ich falsch?



  • Also: Wenn du den operator= geschafft hast, ist der Copy-Konstruktor das Selbe.

    Woran scheitert es denn beim = ?
    Deklaration?

    CStringArray& operator= (const CStringArray& quellArray);
    

    Und dann musst du den Inhalt nur in einer Schleife rüberkopieren. Ist doch ganz einfach. 🙂



  • Hi, ich habe leider beides noch nicht geschafft, zu schreiben!
    Bin da ein bisschen zu, naja vielleicht zu kompliziert.
    Wenn du eine Lösung hast, würde ich mich natürlich freuen.



  • Hmm, naja hab grade Lust dazu:

    Den Teil für den Header hast du ja schon.

    Hier kommt der Rest:

    CStringArray& CStringArray::operator= (const CStringArray& quellArray)
    {
        // Erstmal das aktuelle leer machen
        RemoveAll();
    
        // Jetzt per Schleife über die Quelle laufen und rüberschieben
        for (int i = 0; i < quellArray.GetSize(); i++)
        {
            Add(quellArray.GetAt(i));
        }
    }
    

    Is doch ganz einfach, oder? Den Copy-Konstruktor solltest du nun aber schaffen - musst nur das = richtig aufrufen. :p


Anmelden zum Antworten