Array von Objekten



  • Hallo,

    wie in https://www.c-plusplus.net/forum/340610 schon erwähnt komme ich nicht von C#, versuche aber gerade jemanden dabei zu helfen.

    Ich habe ein Problem mit dem Nutzen von Arrays von Objekten. Dazu habe ich folgenden Code, in dem ich schon einmal geschrieben habe was funktioniert und was nicht.

    namespace ArrayList_Object
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                Klasse1 test1 = new Klasse1(1);
                Console.WriteLine(test1.A);
                //Klasse2[] test2 = new Klasse2[5];  // Wie kann ich hier für alle 5 noch den Konstruktor aufrufen?
                //   test2[0].B = 1;   // Wieso funktioniert das nicht?
    
                //  test1.test3.B = 11;  // das funktioniert
                //  Console.WriteLine(test1.test3.B);  // 
    
                test1.test3[0].B = 1;  // funktioniert nicht
    
            }
    
        }
    }
    
    class Klasse1
    {
    
        public Klasse1(int a) { this.a = a; }
    
        // public Klasse2 test3 = new Klasse2(1); das funktioniert
    
        public Klasse2[] test3 = new Klasse2[5];
    
        private int a;
        public int A { get { return this.a; } set { this.a = value; } }
    
    }
    
    class Klasse2
    {
        public Klasse2(int b) { this.b = b; }
    
        private int b;
        public int B { get { return this.b; } set { this.b = value; } }
    }
    

    Zum einen schaffe ich es nicht ein Array von Objekten zu verwenden. Der Fehler bei test2[0].B = 1; wird vielleicht daran liegen, dass die "b's" noch nicht initialisiert werden, weil ich bei dem erstellen des Arrays den Konstruktor nicht aufrufe? Wenn ja, wie ist es möglich beim erstellen des Arrays auch für jedes Objekt den Konstruktor aufzurufen sowas wie:

    Klasse[] Objekt = new Klasse [5](Par1, Par2,...Par3,...,...)
    

    Ich vermute das Problem beim erstellen des Arrays von Objekten Klasse2 in der Klasse 1 wird das selbe sein. Ich bin sehr dankbar für Hilfe und Ratschläge.

    Angewendet soll das werden um etwas mit Listen innerhalb einer Aufgabe zu lösen. Ich hoffe, dass die Lösung dieses Problems auch übertragbar ist auf das mit den Listen.

    Vielen Dank und viele Grüße,
    Erano1



  • Du liegst schon richtig mit deiner Vermutung bzgl. "noch nicht initialisiert werden".
    Beim Anlegen eines Arrays werden die einzelnen Elemente nur "default initialized", d.h. bei Referenztypen (wie Klassenobjekte) auf "null" gesetzt.
    Du mußt dann nachträglich die passenden Referenzen erzeugen und setzen:

    Klasse2[] test2 = new Klasse2[5];
    
    for (int i = 0; i < test2.Length; i++)
      test2[i] = new Klasse2(/*...*/);
    


  • Vielen Dank!

    Daran, dass man erstmal nur Referenzen erzeugt muss ich mich erstmal gewöhnen 🙂



  • In C++ wäre es ja einfach

    Klasse2 *test2 = new Klasse2*[5];
    

    und auch dabei wären die Inhalte des Arrays ja noch undefiniert (außer als globale Variable, denn dann wären die Inhalte auch Nullzeiger - C# hat den Vorteil, daß sie immer mit 'null' initialisiert werden).


Anmelden zum Antworten