Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

21

12.01.2006, 18:05

Zitat von »"Meandor"«


Ersteinmal super Einfall das mit dem Enum das erleichtert einiges! Ist besser als #define GEMELDET 'G' .
nach den REGISTERED darf kein Semi stehen! Also das schon mal weg lassen. Sonst Compiler Fehler! Zumindest gab es das bei mir!


stimmt

Zitat von »"Meandor"«


was ich jetzt nicht ganz verstehe ist

C-/C++-Quelltext

1
2
3
4
5
6
bool operator < (Element& e const) const 
  { 
    if(status == REGISTERED && e.status == ACTIVE) 
      return true; 
    return false; 
  }

das ist also eine Funktion innerhalb der Struktur (wußte gar nicht das das geht dachte das klappt nur bei Klassen

structs sind nichts anderes als Klassen, bei denen standardmäßig alles public ist

Zitat von »"Meandor"«


solche memberfunktionen oder was ist das genau also laut msdn verstehe ich das das neue Wort operator für Overloadings zuständig ist.

Mit dem Schlüsselwort operator kann man die Operationen (-1), +, -, *, /, <, >, << u. >> für Datenstrukturen definieren

Zitat von »"Meandor"«



wie kann ich denn eine solche Funktion dann auf rufen einfach nur sort(); und fertig??
verbiegt diese Funktion dann automatisch die Listenzeiger auf den nachfolgenden bzw dem Vorgänger?
Ansich gibt diese Funktion ja nur eine NULL oder eine 1 aus.


Nein Dass vertehst du falsch
Die Funktion liefert nur einen Wert, der true ist (wenn Objekt kleiner als Vergleichsobjekt) oder false (Objekt nicht kleiner als Vergleichsobjekt).
Noch mal ein Beispiel aufbauend auf den oberen Code:

C-/C++-Quelltext

1
2
3
4
5
6
Element e1; e1.nr = 0; e1.time = 0; e1.status = ACTIVE;
Element e2; e2.nr = 0; e2.time = 0; e2.status = REGISTERED 

//Hier folgen 2 aufrufe der Operatorfunktion von Element

bool b1 = e1 < e2;   //b1 bekommt den Wert false

bool b2 = e2 < e1;  //b2 bekommt den Wert true


Natürlich kann jetzt auch die STL-Liste diesen Operator verwenden um herauszufinden, wei die richtige Reihenfolge der Elemente in der Liste ist.

Die Datenstruktur selbst weiß nicht, dass sie jemals zu einer Liste gehören wird.

Zitat von »"Meandor"«


Was sollen die zwei const in der einen Zeile?

Das const nach e sagt, dass e innerhalb der Operatorfunktion nicht verändert werden darf.
Das zweite const sagt, dass der Operator ihm zugehörige Objekt (oder anders gesagt das this-Objekt) nicht verändern kann.

mfg Philipp

Meandor

Frischling

  • »Meandor« ist der Autor dieses Themas

Beiträge: 55

Wohnort: Oberhausen

Beruf: Student

  • Private Nachricht senden

22

12.01.2006, 18:23

Vielleicht ist jetzt zuviel durcheinander geschrieben worden
Hier nochmal der komplette Beispiel Quelltext von mir:

C-/C++-Quelltext

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
73
74
75
76
77
78
79
#include <iostream>
#include <list>
using namespace std;
void Liste_ausgeben(); //Prototyp der Funktion Liste_ausgeben()

enum STATUS //Definition des Status

{ 
  AKTIV, GEMELDET 
};
class Auftragsliste //Die Klasse der Auftragsliste alles public deklariert 

{
public:
    Auftragsliste(int Wert, double Zeit, STATUS Status) //char status

    {
        m_Zeit=Zeit;
        m_Wert=Wert;
        m_Status=Status;
    }
    double m_Zeit;
    int m_Wert;
    STATUS m_Status; //mit enum definiert

};
//globale Variablen deklariert! Damit die Funktion Liste_ausgeben() den iterator kennt; 

list<Auftragsliste*> lAuftrag;
list<Auftragsliste*>::iterator i;
int main()
{
    int Anzahl =0;
    Auftragsliste *Temp = NULL;
    cout <<"Wie viele Aufträge erzeugen?"<<endl;
    cin>> Anzahl;
    for (int j=0; j<Anzahl; j++)
    {   Temp = new Auftragsliste(1,1,GEMELDET);
        lAuftrag.push_back (Temp);
    }
    Anzahl=0;
    for (i=lAuftrag.begin(); i!=lAuftrag.end(); ++i)
    {   cout<<"DAS ELEMENT "<<(*i)->m_Wert<<" wird bei der Zeit :" <<(*i)->m_Zeit<<" der Status : ";
        if((*i)->m_Status==GEMELDET)
        cout<<"GEMELDET"<<endl;
        else
        cout<<endl;
    }   cout<<endl;
    
    for (i=lAuftrag.begin(); i!=lAuftrag.end(); ++i)
    {
        (*i)->m_Wert = Anzahl;
        (*i)->m_Zeit = 500;
        (*i)->m_Status = GEMELDET;
        Anzahl ++;
    }
    Liste_ausgeben();//Ausgabe der Liste!

    lAuftrag.insert(lAuftrag.begin(), new Auftragsliste(7,900,GEMELDET)); //Einfügen eines neuen Elementes

    Liste_ausgeben();
    i=lAuftrag.end(); //Iterator zeigt aufs Listenende

    i--;
    i--;//Zwei Schritte zurück gehen zeigt jetzt auf das vorletzte Element aus der Liste


    lAuftrag.erase(i); //Hier wird das vorletzte Element aus der Liste gelöscht

    cout<<endl;
    Liste_ausgeben(); //Zur Überprüfung Liste anschauen

    
    for (i=lAuftrag.begin(); i!=lAuftrag.end(); i++) //Liste aus dem Heap wieder komplett freigeben! 

    {
        delete (*i);
        (*i) = NULL;
    }
    lAuftrag.clear();
    return 0;
}//main


void Liste_ausgeben() //Definition der Funktion Liste_ausgeben()

{
    for (i=lAuftrag.begin(); i!=lAuftrag.end(); ++i)
    {   cout<<"DAS ELEMENT "<<(*i)->m_Wert<<" wird bei der Zeit :" <<(*i)->m_Zeit<<" der Status : ";
        if((*i)->m_Status==GEMELDET)
        cout<<"GEMELDET"<<endl;
    }
    cout<<endl;
}


So also wenn man dies eingibt dann wird die Liste erzeugt und ausgeben! Dann werden noch ein paar weitere Elemente der Klasse Auftragsliste hineingeschoben. Mit lAuftrag.erase(Position) bin ich in der Lage Elemente zu löschen nur wie bekomme ich diese mit sort() sortiert? z.B. nach der Zeit. das Element mit dem kleinsten Zeitwert soll vorne stehen wenn ich die Liste ausgebe!

Wie soll ich das jetzt verstehen was Phil schreibt, wo muss ich dass denn alles einbauen?
In die Klasse Auftragsliste?
was soll das

C-/C++-Quelltext

1
bool operator < (Element& e const) const

zwei const hintereinander? Sorry aber ich habe irgendwie den Faden verloren. Kann mir jemand helfen?

Meandor

Frischling

  • »Meandor« ist der Autor dieses Themas

Beiträge: 55

Wohnort: Oberhausen

Beruf: Student

  • Private Nachricht senden

23

13.01.2006, 22:18

wie funktionieren genau diese Operatoren kann mir einer einen Tip geben?

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

24

13.01.2006, 22:47

Einmal versuch ich es noch

C-/C++-Quelltext

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
struct s_int
{
  __int32 i;
  __int32 operator + (s_int const& s)
  {
    return i + s.i;
    }

  __int32 add(s_int const& s)
  {
    return i + s.i;
  } 
};

s_int s1_op, s2_op;
s_int s1_func, s2_func;

s1_op.i = 100; 
s2_op.i = 200;

s1_func.i = 100;
s2_func.i = 200;

s_int s3_op = s1_op + s2_op;  //s3_op is 300 then

s_int s3_func = s1_func.add(s2_func);  //s3_func is 300 then


Der Operator funkioniert wie eine normale Funktion es ist einfach nur ein anderer Syntax, denn wir Menschen sind gewohnt, Ergebnis = Operand1 + Operand2 zu schreiben und nicht Ergebnis = Operand1.add(Operand2).

Also noch einfacher kann ich es wirklich nicht mehr erklären, sorry

mfg Philipp

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

25

14.01.2006, 14:34

Das Sortieren mit sort klappt ganz einfach deshalb nicht, weil du Pointer in der Liste speicherst. Und weil man bei Pointern auch vergleichen kann, wer größer ist (sind ja normale Zahlen) gibt's auch keinen Fehler.

Wenn du das trotzdem sortieren willst, musst du wohl deine eigene sort Methode schreiben...

Aber warum speicherst du in der Liste überhaupt Zeiger? Das macht da eigentlich nur Sinn, wenn man Polymorphie benutzt. Und das scheinst du ja nicht zu tun...

Ciao

Werbeanzeige