Generische Klassen mit überladenen Operatoren in C#

Neue Frage »

Auf diesen Beitrag antworten »
Matze84 Generische Klassen mit überladenen Operatoren in C#

Meine Aufgabe diesmal lautet:

Aufgabe4

Das ganze bezieht sich auf:

Vorlesungsskript Seite 73 bis 82 (ungefähr)

ACHTUNG: er hat gern mal falsche (nicht funktionierende) Beispiele drin, sagt das dann aber "nur" in der Vorlesung.

Bisher habe ich folgendes geschrieben, wobei das meiste einfach dem Skript entnommen ist, weil ich es nur schlecht verstanden habe.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Mengenoperation
{
    class ValueSet<T> where T:IComparable
    {
        private T[] values;
        private int capacity;
        private int count;
        // hier die erforderlichen Definitionen

        public ValueSet(int capacity)
        {
            this.capacity = capacity;
            this.values = new T[capacity];
        }

        public void AddValues(params T[] values)
        {
            foreach (T element in values)
            {
                this.values[this.count] = element;
                this.count++;
            }
        }

        public static ValueSet<T> operator +(ValueSet<T> v1, int v2)
        {
            ValueSet<int> tmp = new ValueSet<int>(20);

            return tmp;
        }
        public void Print(ValueSet<T> v1)
        {
            for (int i = 0; i < this.count; i++)
            {
                Console.WriteLine(this.values[i]);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ValueSet<int> V1 = new ValueSet<int>(100);
            ValueSet<int> V2 = new ValueSet<int>(100);
            
            V1 = V1 + 1 + 3 + 6;
            V2 = V2 + 4 + 3 + 7 + 6;
            /*
            ValueSet<int>.Print(V1); // 1 3 6
            ValueSet<int>.Print(V2); // 4 3 7 6
            ValueSet<int>.Print(V1 & V2); // 3 6
            ValueSet<int>.Print(V1 | V2); // 1 3 6 4 7 
            ValueSet<int>.Print(V1 / V2); // 1 
            ValueSet<string> V3 = new ValueSet<string>(100);
            ValueSet<string> V4 = new ValueSet<string>(100);
            V3 = V3 + "AA" + "BB" + "CC";
            V4 = V4 + "BB" + "GG" + "CC" + "FF";
            ValueSet<string>.Print(V3); // AA BB CC
            ValueSet<string>.Print(V4); // BB GG CC FF
            ValueSet<string>.Print(V3 & V4); // BB CC
            ValueSet<string>.Print(V3 | V4); // AA BB CC GG FF 
            ValueSet<string>.Print(V3 / V4); // AA
             * */
        }
    }
}

Ja da fehlt noch eine Menge und meine IDE unterstreicht auch einiges rot.... aber so richtig Plan hab ich leider noch nicht.

Ich hoffe dass ihr mich auch diesmal auf den richtigen Weg verhelfen könnt smile
Ich will es wie gesagt verstehen, denn alles andere bringt mir nichts großes Grinsen

LG Matze
 
Auf diesen Beitrag antworten »
eulerscheZahl

Habe dir mal den +Operator überladen und die Ausgabe gemacht:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
        public static ValueSet<T> operator +(ValueSet<T> v1, T v2)
        {
            v1.values[v1.count++] = v2; //übergebenen Wert anfügen, count danach erhöhen
            return v1;
        }

        public static void Print(ValueSet<T> v1) //static ergänzt
        {
            for (int i = 0; i < v1.count; i++)
            {
                Console.Write(v1.values[i]);
                if (i < v1.count - 1) Console.Write("; "); //Wenn noch Werte folgen
                else Console.Write("\n"); //sonst
            }
        }

Du wolltest beim +Operator ein ValueSet<int> erzeugen und zurückgeben, an Stelle des <int> muss aber ein <T> stehen.

Print muss static sein, damit es von static void Main aufgerufen werden kann. Habe dort noch Trennzeichen eingefügt.
Auf diesen Beitrag antworten »
Airblader

Randbemerkung: Ich weiß nicht, ob sich die Gepflogenheiten hier unterscheiden, aber im matheboard wird es nicht gerne gesehen, die Aufgaben extern zu verlinken. Entweder direkt im Forum anhängen oder abtippen, damit es nicht irgendwann tote Links sind.
Auf diesen Beitrag antworten »
Matze84

Ok werde ich mir merken und in Zukunft dann rein kopieren.

@eulersche Zahl:
Danke erstmal. Ich werd mich gleich mal ran machen und versuchen die anderen Operatoren zu überladen.

Frage: warum muss Print() und auch diese Überladenen Operatoren-Geschichte "static" sein?
Ja die IDE meckert sonst, aber warum?
 
Auf diesen Beitrag antworten »
Matze84

Für den &-Operator habe ich mir folgendes überlegt...

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 public static ValueSet<T> operator &(ValueSet<T> v1, ValueSet<T> v2)
        {
            ValueSet<T> result = new ValueSet<T>(100);
            for (int i = 0; i < v1.count; i++)
            {
                for (int j = 0; j < v2.count; j++)
                { 
                    if() // Die Werte von v1 und v2 stück für stück miteinandern vergleichen.
                    {
                    }
            }
                return result;
        }


Ich will quasi beide Stück für Stück vergleichen, und wenn 2 Werte gleich sind, soll er Sie an zu result addieren quasi. aber egal wie ich die beiden vergleichen will der sagt mir immer, das ich das mit dem "operator" nicht machen kann. (Beispiel ==)
Muss ich den dann auch noch überladen?
Oder gibt es eine andere Methode?
Habe in der Vorlesung was von CompareTo gehört.
Weiß aber nicht ob und wie man das anwenden kann.

Problem schon allein gelöst...

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public static ValueSet<T> operator &(ValueSet<T> v1, ValueSet<T> v2)
        {
            ValueSet<T> result = new ValueSet<T>(100);
            for (int i = 0; i < v1.count; i++)
            {
                for (int j = 0; j < v2.count; j++)
                {
                    if (v1.values[i].CompareTo(v2.values[j]) == 0) // Die Werte von v1 und v2 stück für stück miteinandern vergleichen.
                    {
                        result += v1.values[i];
                    }
                }
            }
                return result;
        }

Ich hatte bei
"class ValueSet<T> where T:IComparable" das (where T:IComparable) auskommentiert und somit stand die Methode offensichtlich nicht zurVerfügung...
Auf diesen Beitrag antworten »
eulerscheZahl

Statt CompareTo geht auch: if (v1.values[i].Equals(v2.values[j]))

Zu static verweise ich dich mal an die Onlinehilfe
Auf diesen Beitrag antworten »
Matze84

Ok Danke... funktioniert alles soweit smile
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »