Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Generische Klassen mit überladenen Operatoren in C# » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Generische Klassen mit überladenen Operatoren in C#
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Generische Klassen mit überladenen Operatoren in C# Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
26.04.2013 22:57 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
27.04.2013 11:26 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Airblader Airblader ist männlich
Doppel-As


Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
The best thing about a boolean is that even if you're wrong, you're only off by a bit.
27.04.2013 12:28 Airblader ist offline Beiträge von Airblader suchen Nehmen Sie Airblader in Ihre Freundesliste auf
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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?
27.04.2013 14:08 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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...

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Matze84: 27.04.2013 14:36.

27.04.2013 14:28 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

Zu static verweise ich dich mal an die Onlinehilfe

__________________
Syntax Highlighting fürs Board (Link)
27.04.2013 14:42 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ok Danke... funktioniert alles soweit smile
30.04.2013 04:19 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Generische Klassen mit überladenen Operatoren in C#