Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zuweisungsoperator zickt rum!

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
14.08.2006, 14:50 Uhr
Yadgar



High!

Nachdem ich dass (vergleichsweise banale) Ausgabe-Problem gelöst habe, taucht jetzt natürlich das nächste, wohl nicht mehr ganz so banale auf:

Für eine Klasse "FixedArray", die eine Verbesserung der herkömmlichen Felder sein soll, programmierte ich zunächst einmal einen einfachen Zuweisungsoperator:


C++:
FixedArray& FixedArray::operator = (const FixedArray& fa)
{
   #ifdef TEST
   cout << "Expliziter Zuweisungsoperator aktiv!" << endl;
   #endif
   if (&fa == this) // Überprüfung auf Selbstzuweisung
      return *this;
   if (dim != fa.dim)
   {
      cerr << "Zuweisung nicht m" << (char)148 << "glich!";
      exit(1);
   }
   copy (fa.wert, fa.wert+dim, wert);

   return *this;
}



und einen Additionsoperator:


C++:
FixedArray& FixedArray::operator + (const FixedArray& f2)
{
   if (!diffLengths(f2))
   {
      cout << "FixedArray-Objekte unterschiedlicher Gr" << (char)148 << char(225)
           << "e k" << (char)148 << "nnen nicht addiert werden!";
      exit (1);
   }
   int i=0;
   do
   {
      #ifdef TEST
        cout << "Schleife laeuft" << endl;
      #endif
      wert[i]+=f2.wert[i];
      #ifdef TEST
        cout << wert[i] << endl;
      #endif
      i++;
   }
   while (i<dim);
}



Der Testausgabe zufolge funktioniert der Additionsoperator einwandfrei... mit dem zurückgelieferten Ergebnis kann jedoch der Zuweisungsoperator (das Ergebnis soll einem dritten FixedArray-Objekt zugewiesen werden) nichts anfangen und hängt sich in einer Endlosschleife auf!

Na sowas... ich stelle gerade fest, dass bei operator + gar kein Return steht! Trotzdem beschwert sich der Compiler nicht! Implizites Return halte ich für keine gute Idee... wieso läßt gcc sowas zu?

Mit


C++:
return *this;



läuft es einwandfrei!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.08.2006, 15:54 Uhr
0xdeadbeef
Gott
(Operator)


Der Additionsoperator sieht mir etwas seltsam aus, eigentlich - mehr wie ein +=-Operator. Ich hätte da jetzt sowas wie

C++:
FixedArray operator+(FixedArray const &fa1, FixedArray const &fa2) {
  if(fa1.dim != fa2.dim) throw "Fehler"; // Draußen dann halt mit try/catch die Exception behandeln.

  FixedArray newfa(fa1.dim); // In der Annahme, dass ein solcher Konstruktor existiert

  for(int i = 0; i < fa1.dim; ++i)
    newfa[i] = fa1[i] + fa2[i];

  return newfa;
}


Allerdings würd ich im Zweifel ne darauf zugeschnittene Exception-Klasse schmeißen anstelle eines einfachen strings. Der Zuweisungsoperator sieht auch sinnvoll aus - haste vielleicht ein Hauptprogramm dazu, das schief geht, damit ich den Fehler nachvollziehen kann?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.08.2006, 17:47 Uhr
Yadgar



High!


Zitat von 0xdeadbeef:
Allerdings würd ich im Zweifel ne darauf zugeschnittene Exception-Klasse schmeißen anstelle eines einfachen strings. Der Zuweisungsoperator sieht auch sinnvoll aus - haste vielleicht ein Hauptprogramm dazu, das schief geht, damit ich den Fehler nachvollziehen kann?


Das ist im Moment auch nicht mehr das Problem, sondern es tauchte ein neues auf:


C++:
void FixedArray::operator += (const FixedArray f2)
{
   #ifdef TEST
     cout << "L" << (char)132 << "nge: " << length() << endl;
     cout << "L" << (char)132 << "nge des " << (char)129 <<"bergebenen Objekts: " << f2.length() << endl;
   #endif      
   if (!diffLengths(f2))
   {
      cout << "FixedArray-Objekte unterschiedlicher Gr" << (char)148 << char(225)
           << "e k" << (char)148 << "nnen nicht addiert werden!";
      exit (1);
   }
   int i=0;
   do
   {
      wert[i]+=f2.wert[i];
      i++;
   }
   while (i<dim);

   return *this;
}



Die Operatorfunktion bekommt ein zweites Objekt übergeben, falls das Präprozessorflag TEST gesetzt ist, wird zur Kontrolle (denn da gibt es NOCH ein Problem, zu dessen Lösung ich bis jetzt noch gar nicht durchgestoßen bin) die Anzahl der Elemente beider beteiligter Elemente angezeigt (FixedArray::length()). Diese Funktion ist trivial, sie besteht lediglich aus return dim;. Dummerweise bekomme ich aber, sobald ich das dim des übergebenen Files auslesen will, die Fehlermeldung

passing `const FixedArray' as `this' argument of `int FixedArray::length()' discards qualifiers

Ist es prinzipiell nicht möglich, aus einer Methode heraus eine zweite Methode für ein anderes Objekt als das der aufrufenden Methode zugeordnete Objekt aufzurufen?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.08.2006, 17:56 Uhr
~Blubber2063
Gast


Also ich seh jetzt grob keinen Fehler ausser bei deiner operator deklaration, der Rumpf ist sowas von Unsinnig, ein Const macht bei call by value überhaupt keinen Sinn, denn wer sollte den Zugriff auf die Kopie danach haben, könnte sein das dein Fehler verschwindet, wenn du dir mal angewöhnst, bei Objekten nach Möglichkeit call by reference zu machen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.08.2006, 18:38 Uhr
(un)wissender
Niveauwart


length muss const-Metohde sein.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.08.2006, 12:50 Uhr
0xdeadbeef
Gott
(Operator)


Erklärung dazu:

C++:
class foo {
  void bar() {
    // Hier ist this vom Typ foo *, die Instanz ist also nicht konstant
  }
  void baz() const {
    // Hier ist this vom Typ foo const *, die Instanz ist also konstant
  }
};

// ...

foo my_foo;
foo const my_const_foo;

my_foo.bar();  // geht
my_foo.baz();  // geht
my_const_foo.bar(); // geht nicht, my_const_foo soll implizit von foo const nach foo konvertiert werden, was nicht hinhaut
my_const_foo.baz(); // geht


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.08.2006, 14:23 Uhr
(un)wissender
Niveauwart


Ja ich bin da immer etwas spartanisch...
--
Wer früher stirbt ist länger tot.
 
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: