Objekte gruppieren



  • Hallo :).

    Ich bin neu in dem Forum und hoffe, keine Regeln zu verletzen und alles verständlich zu machen. Ich habe als Programmieraufgabe einen Wortsortierer bekommen, der Sämtliche Worte einer .txt-Datei erfassen soll, sie nach den beiden Anfangsbuchstaben alphanumerisch katalogisieren, und dann in umgekehrt alphanumerischer Reihenfolge hinter den Kategorien ausgeben soll.

    Neben einer 2-jährigen Pause im C++ Programmieren hab ich mich vorher auch noch nie mit managed C++ beschäftigt. Nach etwas Einarbeitungszeit und viel MSDN 2 wälzen bin ich schon relativ weit.

    Ich habe eine Klasse listobject entworfen, aus der ich eine Liste, mehrere Kategorien und letztendlich die einzelnen Listenteile instanziiere.

    ref class listobject
    {
    public:
    	//Methoden
    	listobject(void);
    	void setName(String^ sString) { m_sName = sString; }
    	String^ getName() { return m_sName; }
    	void addPart(listobject^ oHandle);
    	void sortParts(String^ sOrder);
    	void setRank(int iRank) { m_iRank = iRank; }
    	int getRank() { return m_iRank; }
    private:
    	//Membervariablen
    	String^ m_sName;
    	int m_iRank;
    	array<listobject^>^ m_aHandles;
    };
    

    Ich hatte mir das so gedacht, dass ich die Handles von meinen listobjects in ein Array im jeweiligen hirarchisch höheren Objekt packe (Siehe Definition von addPart). Dadurch wäre dann ja eine Gruppierung gegeben.

    void listobject::addPart(listobject^ oHandle)
    {
    	String^ sName = oHandle->getName();
    	bool bFound = false;
    
    	for (int i = 0; m_aHandles->GetLength(0) > i; i++)
    	{
    		int iCompare = String::Compare(m_aHandles[i]->getName(),oHandle->getName());
    
    		if (0 == iCompare) bFound = true;
    	}
    
    	if (false == bFound)
    	{
    		m_aHandles[m_aHandles->GetLength(0)] = oHandle;
    	}
    }
    

    Allerdings muss ich da einen riesigen Logikfehler drin haben, denn ich erzeuge, sobald addPart aufgerufen wird eine NULLReferenz. Bin ich komplett auf dem Holzweg? Geht das generell überhaupt? Oder wäre es ein schlauerer Weg, das Array im Hauptprogramm zu initialisieren und im Objekt nur zu referenzieren. Alle Objekte in ein Array und nach Art unterscheiden?

    Ein kleiner Tipp wäre echt hilfreich :). Ich hoffe mein Anliegen ist verständlich dargelegt :).



  • Hi,
    Ich sehe keinen Code der deine Member Variabeln erzeugt/initialisiert.
    Z.B. m_aHandles, das ist in diesem Fall ein nullptr.

    Warum nimmst Du eigentlich nicht eine etwas komfortablere Collection?
    (Du nimmst ja ein array, warum nicht eine System::Collections::Generic::List<...> ?)

    Simon



  • Naja es gibt ja eigentlich nur 3 Variablen.

    m_iRank (für den Listenplatz und den Sortieralgorithmus) wird im Konstruktor auf 0 initialisiert.
    m_sName wird nach der Instanziierung per setName() gesetzt.

    Und die m_aHandles hatte ich eben vor ähnlich zu "füllen" mit der addPart()-Funktion.

    Hmm ich glaube jetzt wird mir mein Fehler bewusst. Per Haltepunkt konnte ich ja schon feststellen, dass es bei der GetLength-Methode am Anfang der for-Schleife hakt. Ich checke also am Besten einfach nochmal, ob das Array überhaupt initialisiert ist, bevor ich versuche auf deren Methoden zuzugreifen.

    Und die Option Collections war mir völlig unbekannt. Danke für diese beiden Tipps, ich werde mich mal wieder dran setzen und mich melden wie es ausging ^^.


Anmelden zum Antworten