Klassen-Indexer



  • Hallo,

    ich versuche nun seit längerem eine Klasse mit Klassenindexer zu programmieren.

    Die einzelnen Eigenschaften mit Indizees zu versorgen war kein Problem. Allein der Klassen-Indexer geht nicht.

    Ich hatte aus einem Buch nur ein Beispiel mit einem Integer als Eigenschaft.

    Der Klassen-Indexer hat in diesem Beispiel als Get-Methode auch ein Integer als Rückgabewert.

    Da ich nun mehrere Eigenschaften (Listen mit verschiedenen Dateiformaten) habe, wollte ich die Klasse an sich als Rückgabewert haben. Leider funktioniert das nicht.

    Hat mir jemand einen Hinweis, wie der Klassen-Indexer zu implementieren ist?

    Mein Code bisher:

    #pragma once
    using namespace System;
    using namespace System::Collections::Generic;
    
    ref class dbwrap
    {
    	List<String ^> ^dbBundesland;
    	List<int> dbRang, dbAktData;
    	List<float> dbEinwohner;
    
    public:
    	dbwrap(void);
    
    	property String ^ Bundesland[int]
    	{
    		String ^ get(int idx)
    		{
    			return dbBundesland[idx];
    		}
    		void set (int idx, String ^wert)
    		{
    			dbBundesland[idx] = wert;
    		}
    	}
    
    	property int Rang[int]
    	{
    		int get(int idx)
    		{
    			return dbRang[idx];
    		}
    		void set(int idx, int wert)
    		{
    			dbRang[idx] = wert;
    		}
    	}
    
    	property float Einwohner[int]
    	{
    		float get(int idx)
    		{
    			return dbEinwohner[idx];
    		}
    		void set(int idx, float wert)
    		{
    			dbEinwohner[idx] = wert;
    		}
    	}
    
    	property int AktData[int]
    	{
    		int get(int idx)
    		{
    			return dbAktData[idx];
    		}
    		void set(int idx, int wert)
    		{
    			dbAktData[idx] = wert;
    		}
    	}
    
    	void CountDB()
    	{
    		Console::WriteLine("{0} Datensätze vorhanden.", dbAktData.Count);
    	}
    
    	void Add(String ^land, int rang, float einwohner)
    	{
    		int aktdata = (dbAktData.Count + 1);
    		dbBundesland->Add(land);
    		dbRang.Add(rang);
    		dbEinwohner.Add(einwohner);
    		dbAktData.Add(aktdata);
    	}
    
    	void PrintOneRow(int idx)
    	{
    		Console::WriteLine("Bundesland: " + dbBundesland[idx]);
    		Console::WriteLine("Rang: " + dbRang[idx]);
    		Console::WriteLine("Einwohner (in Mio): " + dbEinwohner[idx]);
    		Console::WriteLine("DatensatzNummer: " + dbAktData[idx]);
    	}
    
    	void PrintAllRow(void)
    	{
    		Console::WriteLine("-----------------------------------------");
    
    		for(int i=0; i<(dbAktData.Count);i++)
    		{
    			Console::WriteLine("Bundesland: " + dbBundesland[i]);
    			Console::WriteLine("Rang: " + dbRang[i]);
    			Console::WriteLine("Einwohner (in Mio): " + dbEinwohner[i]);
    			Console::WriteLine("DatensatzNummer: " + dbAktData[i]);
    			Console::WriteLine("-----------------------------------------");
    		}
    	}
    
    };
    

    Gruß Solick



  • Funktioniert nicht ist keine Fehlerbeschreibung.



  • Also ich weiss einfach nicht, wie ich den Klassen-Indexer richtig immplementieren soll.

    Hab es unter anderem so versucht:

    property dbwrap default[int]
    	{
    		dbwrap ^get(int idx)
    		{
    			return(dbwrap[idx]);
    		}
    		void set(int idx, dbwrap ^x)
    		{
    			set dbwrap[idx] = x;
    		}
    	}
    

    Allerdings gibts dann folgende Fehlermeldung:

    1>c:\users\xx\documents\visual studio 2008\projects\indexer1\indexer1\dbwrap.h(66) : error C3901: "get": Muss den Rückgabetyp "dbwrap" aufweisen.
    1>c:\users\xx\documents\visual studio 2008\projects\indexer1\indexer1\dbwrap.h(70) : error C3902: "set": Der Typ des letzten Parameters muss "dbwrap" sein.
    1>c:\users\xx\documents\visual studio 2008\projects\indexer1\indexer1\dbwrap.h(74) : error C3903: "dbwrap::default": Hat keine set-Methode oder get-Methode.
    1



  • Die Fehlermeldung gibt dir alle Informationen, die du zur Lösung deines Problems brauchst. Lies mal ein Buch/Tutorial über die Grundlagen zu C++/CLI und/oder C++ und diese Probleme werden keine mehr sein^^

    property dbwrap ^default[int]
        {
            dbwrap ^get(int idx)
            {
                return(dbwrap[idx]);
            }
            void set(int idx, dbwrap ^x)
            {
                set dbwrap[idx] = x;
            }
        }
    

    MfG



  • Hallo rant,

    ich habe dazu Bücher gelesen, so ist es nicht. Dummerweise wird da auch nicht alles erklärt.

    Das referenzierungszeichen ^hatte ich zwar vergessen, ist aber nicht das eigentliche Problem.

    Mir fehlt es schlicht an dem Grundverständnis, wie der Klassen-Indexer implementiert werden soll.

    In meinen Büchern gibt es nur ein Beispiel mit einer Eigenschaft, einem Integer Wert. Ergo ist der Klassen-Indexer auch als Integer-Wert deklariert.

    Vielleicht lasse ich den Klassen-Indexer einfach weg und greife über die Eigenschaften-Indexer zu... das geht ja bereits. Ich dachte nur, der Klassen-Indexer macht es vielleicht einfacher bzw. strukturierter.

    Gruß Solick



  • Hallo
    Bei mir im Buch steht das so ohne Klassenangabe

    [code]
    property int default[int] {
      int get(int idx) {
        return(feld[indx]);
        }
    void set(int idx, int wert) {
       feld[idx]=wert;
      }
     }
    

    [/code]

    Grus Heinerich



  • Hallo Heinerich,

    bei mir auch. Ist der Willms oder?

    Mein Verständnisproblem bezieht sich ebend darauf, wie kann nun den Indexer für die Klasse implementiert. Sein Beispiel beinhaltet nämlich sowohl den Eigenschaften-Indexer wie den Klassen-Indexer.

    Schreibt man zu jedem Eigenschaften Indexer einfach das Default hinzu und bekommt so einen Klassen-Indexer?

    GRuß Solick


Anmelden zum Antworten