Elegante Lösung Strukturenvergleich
-
Aloha,
ich suche nach einem schönen Weg die Werte von zwei Strukturen zu vergleichen.
Beispiel :
struct mystruct{ int wert1; int wert2; int wert3; CString wert4; .... }Nu habe ich zwei vom typ mystruct ( struct1 & struct2 ), und möchte sehen, ob die beiden sich in einzelnen Werten unterscheiden, und wenn ja in welchen.
Die unschöne Herangehensweise ist :
if(struct1.wert1 == struct2.wert1){ mach was }else{ mach was } if(struct1.wert2 == struct2.wert2){ usw...Ist doch Hackersch..sse.
Es gibt bestimmt elegantere Lösungen, nur fallen sie mir grad net ein...
Grüße
BOA
-
Wie wärs wenn du den == Operator überlädst?
-
Aloha,
ist ne schöne Sache, aber dann muß ich doch an einer anderen Stelle diese Abfragen machen, nämlich dort, wo ich die Überladung definiere, oder stehe ich jetzt auf dem Schlauch ?
Wobei Operator - Überladungen natürlich elegant aussehen, keine Frage.

Grüße
BOA
-
Das einzige was mir einfällt un den code etwas zu kürze (find ich aber nicht elegant) wär das:
if( (struct1.wert1 == struct2.wert1) || (struct1.wert2 == struct2.wert2) ) { mach was } else { mach was }Geht natürlich nur, wenn nach dem if und dem else immer das gleiche passiert.
-
Aloha headfinger,
passiert leider net.
Ich muß unabhängig reagieren können, trotzdem
tausend und einen Dank für den Vorschlag.Ich glaube auch, daß mein Thread schwachsinnig ist, denn ich will ja wirklich einzelne Werte vergleichen, ergo muß ich diese auch mühselig ( es handelt sich um ca. 50 Werte ) nach und nach vergleichen, um entsprechend reagieren zu können.
Ich denke ich werde die Operator-Überladung testen, weil ich es schon lange nicht mehr benutzt habe, damit ich nicht einroste.
Grüße
BOA
-
BOA schrieb:
Aloha,
ist ne schöne Sache, aber dann muß ich doch an einer anderen Stelle diese Abfragen machen, nämlich dort, wo ich die Überladung definiere, oder stehe ich jetzt auf dem Schlauch ?
Wobei Operator - Überladungen natürlich elegant aussehen, keine Frage.

Grüße
BOA
Nein, Du stehst nicht auf dem Schlauch.
Ich würde Dir auch eher dazuraten den Operator zu überladen. Sieht einfach eleganter aus.
-
Aloha,
jo, auch dank an Dich, bin gerade dabei....

Grüße
BOA
-
Als kurze Lösung würde mir allenfalls noch einfallen die Structs mit memcpy zu vergleichen, aber das ist aber ziemlich dirty. Ausserdem muss dann sichergestellt sein, dass die padding-bytes immer gleich sind (wovon ich mal rein intuitiv nicht ausgehe) oder man muss packed-structs erzeugen. Ich denke die beste Idee ist hier wirklich eine Überladung des == Operators, auch wenns ein wenig Mühe macht.
-
die Structs mit memcpy zu vergleichen, aber das ist aber ziemlich dirty. Ausserdem muss dann sichergestellt sein, dass die padding-bytes immer gleich sind
Naja, nach einem memcpy ist das sicher kein problem mehr

du meisnt sicher memcmp.. aber auch damit würde ich gar nicht erst anfangen. erstens Zeiger, zweitens - wie du schon sagtest - padding-bytes.
am operator== (und elementweises vergleichen) führt kein allgemeiner Weg vorbei.
-
Mann kann Operatoren doch nur von Klassen überschreiben

-
Rapha schrieb:
Mann kann Operatoren doch nur von Klassen überschreiben

auch struktoren könne operatoren haben und methoden und kostruktoren und destruktoren und virtuelle funktionen und vererbung und templates und alles halt, was klassen können.
-
Auch schon in C?
Das ist mir ehrlich gesagt neu
Was ist dann der Vorzug einer Klasse (außer dass class schöner aussieht als struct)
?
-
Rapha schrieb:
Auch schon in C?
Das ist mir ehrlich gesagt neu
Was ist dann der Vorzug einer Klasse (außer dass class schöner aussieht als struct)
?in class ist das zeug drinnen private, solange man nicht was anderes schreibt und in struct isses public. da ich das private aber trotzdem hinschreibe in class, isses wurst. "class" läßt sich viel feiner tippen als "struct". außerdem würden mir die leute bei struct nicht glauben, daß der code objektorientiert ist.
-
Stimmt
und vererben kann man bestimmt auch nicht
ich hatte private, public, friend und die Vererbung vergessenGrüße Rapha
-
Rapha schrieb:
Stimmt
und vererben kann man bestimmt auch nicht
stimmt. deshalb hab ich um 15:46 gepostet, daß vererbung geht.
bevor es zu lange dauert, hier die ganze geschichte:
daß in struct per default die sachen public sind und in class private ist der einzige unterschied!struct Foo:public string { private: Foo(const Foo&); public: Foo() :string("hallo") { } virtual ~Foo() { } friend ostream& operator<<(ostream& out,Foo const& f) { return out<<string(f); } };
-
Und schon wieder was gelernt
