Array of Objects in managed code



  • Hallo!

    bin neu in Visual C++ und will mit Hilfe Windows Forms eine kleine Anwendung schreiben.

    Hierzu habe ich eine Klasse 'Circle' angelegt.

    ref class Circle
    {
    public:
    	Circle(void);
    
    	int posX;
    	int posY;
    
    	void move(int, int);
    };
    

    Nun würde ich gerne bei Void button1_Click ein Array mit 100 Objekten vom Typ Circle anlegen.

    Normalerweise würd ich das ja so machen:

    Circle myCircleArray = Circle[100];
    

    um dann mit myCircleArray[1] drauf zuzugreifen.

    aber mit managed code krieg ich das nicht hin. Kann mir jemand helfen der da etwas mehr Erfahrung hat. Hab auch schon google bemüht aber bin leider nicht weit gekommen 😞

    Danke & Gruss,
    DocRocket



  • array<Circle^> c = gcnew Cricle[100];
    


  • well actually

    array<Circle^> ^circles = gcnew array<Circle^>(100);
    


  • Hallo DocRocket,

    auch wenn das nichts mit dem Array zu tuen hat, eine kleine Korrektur der Klasse von mir.

    ref class Circle
    {
    private:
    	Int32 posX;
    	Int32 posY;
    public:
    	Circle(void);
    	void move(Int32, Int32);
    };
    

    Die Attribute werden immer (oder fasst immer) als private deklariert, denn es ist nicht Sinn der Attribute das man die von außen ändern kann, außer durch die Methode move.

    Gruß
    Rudi G



  • Erstmal vielen Dank!

    Dann müsst ihr mir jetzt nur noch bei einem helfen:

    Wie greife ich denn dann auf die Methode move zu?

    Geht das mit GetValue?



  • Um die Frage zu präzisieren:

    Wie sieht ein Setter/Getter-Zugriff auf die Methode move() des ersten Circle aus?

    Ohje, ich sehe schon. Alles nicht so einfach! 😞



  • Wie sieht ein Setter/Getter-Zugriff auf die Methode move() des ersten Circle aus?

    Für Methoden gibts keine Getter/Setter. Getter/Setter sind selbst Methoden, welche den Zugriff auf private Variabeln ermöglichen.



  • wenn du das array erstellt hast indem du geschrieben hast:

    array<Circle^> ^circles = gcnew array<Circle^>(100);
    

    schreibst du einfach

    circles[0]->move(10, 10);
    

    oder

    Circle ^currentCircle = circles[0];
    currentCircle->move(10, 10);
    

    hast du das array in einer klasse drin und möchtest aber auf einen bestimmten circle zugreifen schreibst du einfach eine entsprechende methode, eines von den folgenden:

    public:
        Circle ^GetCircleByIndex(int aIndex)
        {
    
            return circles[aIndex];
        }
    public:
        void MoveCircleByIndex(int aIndex, int aNewX, int aNewY)
        {
            circles[aIndex]->move(aNewX, aNewY);
        }
    


  • hahaaaaa! Wenn mich aber nicht alles täuscht muss ich doch das Array irgendwo noch instanziieren. Soweit ich die Syntax verstehe hab ich ja bisher nur 100 Referenzen!

    Gibts da was Elegantes? Oder täusch ich mich?



  • for(int i = 0; i < circles->Length; i++)
    {
        circles[i] = gcnew Circle();
    }
    

    genau so wie du es auch in c++ machen würdest

    du kannst natürlich auch statt

    array<Circle ^> ^circles = gcnew array<Circle ^>(100);
    

    schreiben

    array<Circle> ^circles = gcnew array<Circle>(100);
    

    dann hast du 100 objekte, allerdings muss dann Circle eine "value class" sein



  • "value class" ... das war genau das was ich gesucht habe !!!!

    Super, Vielen Dank ! 🙂


Anmelden zum Antworten