Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » spezielle Operatorüberladung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.03.2011, 15:35 Uhr
~Günther
Gast


Hallo,
ich habe folgendes Problem. Ich muss einen "Vector" in einem Objekt befüllen und muss das mit Hilfe der Operatorüberladung realisieren. Den Vector zu befüllen ist auch nicht das Problem. Das Problem ist der Zugriff auf die einzelnen Werte mit Hilfe der Operatorüberladung.

Infos: Meine Klasse heißt Polynom mit dem Objekt poly1.

poly1 = 1,8,9,63,4

Der Zugriff mit Hilfe der Operatorüberladung auf den ersten Wert "1" ist auch kein Problem. Allerdings verstehe ich nicht mit welcher Operatorüberladung ich auf die folgenden Werte zugreifen soll.

Randbedingungen: Die Schreibweise "poly1 = 1,8,9,63,4" muss so beliben und die Anzahl der Werte muss variabel sein. Und der Zugriff muss via Operatorüberladung sein.

Ich würde mich sehr über Hilfe freuen.
Gruß Günther
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.03.2011, 07:29 Uhr
Tommix



'Morgen,
ich behaupte mal, daß das nicht gehen kann. Der Komma-Operator bewirkt keine Auflistung von Elementen oder so, sondern wird von links nach rechts ausgewertet. Da er außerdem einen niedrigeren Vorrang gegenüber der Zuweisung hat, passiert folgendes:

C++:
int x, y;
x = 1, 2, 3;             // x = 1, ist das gleiche wie
(((x = 1), 2), 3);       // oder,  vielleicht einsichtiger
y = (((x = 1), 2), 3);   // x = 1, y = 3


Den Vorrang und die Assoziativität kannst Du durch überladen nicht ändern.

Gruß, Tommix

Dieser Post wurde am 21.03.2011 um 07:30 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.03.2011, 12:08 Uhr
0xdeadbeef
Gott
(Operator)


Das geht schon - Boost.Assign macht ziemlich genau solche Dinge. Ich rate dir auch dringend dazu, Boost.Assign zu benutzen, wenn du diesen syntaktischen Zucker haben willst.

Grundsätzlich geht das über Proxy-Objekte. Kurz zusammengehackt etwa

C++:
#include <cstddef>
#include <iostream>

class vec3d_assignment_proxy;

struct vec3d {
  int data[3];

  vec3d_assignment_proxy operator=(int x);
};

class vec3d_assignment_proxy {
public:
  vec3d_assignment_proxy(vec3d &self) : self_(self), index_(1) { }

  vec3d_assignment_proxy &operator,(int val) {
    if(index_ >= 3) throw val;
    self_.data[index_] = val;
    ++index_;

    return *this;
  }

private:
  vec3d &self_;
  std::size_t index_;
};

vec3d_assignment_proxy vec3d::operator=(int x) {
  data[0] = x;
  return vec3d_assignment_proxy(*this);
}

int main() {
  vec3d v;

  v = 1,2,3;

  std::cout << v.data[0] << ", " << v.data[1] << ", " << v.data[2] << std::endl;
}


Wichtig bei der Überladung des Komma-Operators: Der Sequenzpunkt geht verloren! Komm nicht auf die Idee,

C++:
v = x++, x++, x++;


zu schreiben, das Verhalten ist dann undefiniert. Für den Compiler liest sich das wie ein geschachtelter Funktionsaufruf der Form

C++:
operator,(operator,(operator=(v, x++), x++), x++);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.03.2011, 14:07 Uhr
Tommix




Zitat von Tommix:
ich behaupte mal, daß das nicht gehen kann.


Asche auf mein Haupt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: