Anscheinend habe ich Kopierkonstruktoren und/oder den queue-Container noch
nicht richtig verstanden.
Folgender Code ...
--------------------------------------------------------------------
// test.hh
#ifndef TEST_HH
#define TEST_HH
class test
{
private:
unsigned short copycounter;
public:
test():copycounter(0){}; // Standardkonstruktor
test(const test&); // Kopierkonstruktor, zaehlt copycounter hoch
unsigned short getCc(); // Gibt copycounter zurueck
};
#endif
--------------------------------------------------------------------
// test.cc
#include "test.hh"
test::test(const test& _blubb) // Kopierkonstruktor
{ copycounter++; }
unsigned short test::getCc() // Gibt copycounter zurueck
{ return(copycounter); }
--------------------------------------------------------------------
// main.cc
#include "test.hh"
#include <iostream>
#include <queue>
using namespace std;
int main(int argc, char* argv[])
{
queue<test> foo;
cout << "foo enthält " << foo.size() << " Elemente." << endl;
test number_one;
cout << "number_one.getCc() sagt: " << number_one.getCc() << endl;
test number_two(number_one);
cout << "number_two.getCc() sagt: " << number_two.getCc() << endl;
foo.push(number_one);
foo.push(number_two);
cout << "(foo.front()).getCc(); sagt: " << (foo.front()).getCc() << endl;
foo.pop();
cout << "(foo.front()).getCc(); sagt: " << (foo.front()).getCc() << endl;
return(0);
}
--------------------------------------------------------------------
... erzeugt die Ausgabe
foo enthält 0 Elemente.
number_one.getCc() sagt: 0
number_two.getCc() sagt: 2
(foo.front()).getCc(); sagt: 1
(foo.front()).getCc(); sagt: 1
was ich mir bis auf die erste Zeile nicht erklären kann. copycounter dürfte
in den Zeilen zwei und drei doch höchstens um 1 differieren, oder? Wo ist
die Kopie mit copycounter==1 geblieben? Das Chaos in meinem Kopf wird
perfekt, wenn ich mir die letzten beiden Zeilen der Ausgabe ansehe.
Wieso erscheinen hier nicht auch unterschiedliche Werte?
In meinen Büchern habe ich keine erhellende Information finden können – für
hilfreiche Hinweise wäre ich echt dankbar.
TIA+Gruß
Gregor
--
Urlaub: Liegen bleiben, bis es weh tut.
> class test
> {
> private:
> unsigned short copycounter;
> public:
> test():copycounter(0){}; // Standardkonstruktor
> test(const test&); // Kopierkonstruktor, zaehlt copycounter hoch
> unsigned short getCc(); // Gibt copycounter zurueck
> };
>
> test::test(const test& _blubb) // Kopierkonstruktor
> { copycounter++; }
Das hat undefiniertes Verhalten, weil copycounter da, wo er erhöht
werden soll, uninitialisiert ist,
Eine Korrektur ist z.B.
test::test(const test& _blubb)
: copycounter(_blubb.copycounter+1)
{
}
, wenn das wirklich ist, was Du willst.
Ich vermute aber, dass copycounter und getCc() statisch sein sollten.
--- Posted via news://freenews.netfront.net/ - Complaints to ne...@netfront.net ---
Ja, du hast da etwas falsch verstanden.
Es nützt überhaupt nichts, wenn du im Standardkonstruktor das
Element copycounter initialisiert, denn du greifst ja im
Kopierkonstruktor
test::test(const test& _blubb)
{ copycounter++; }
gar nicht auf ein initialisiertes Element zurück. Hier ist copycounter
komplett uninitialisiert (Falls du aus der Delphi-Ecke kommst: In
C++ ruft ein Konstruktor keinen "Basis"-Konstruktor auf. Ab C++11
ist es allerdings nun ebenfalls möglich, an einen anderen Konstruktor
zu deligieren).
Wie Thomas schon nahelegte, erfüllen statische Elemente in diesem
Fall die Aufgabe besser. Sie werden typischerweise für Objektzählungen
verwendet, da sie selber "objekt-übergreifend" gültig sind.
Kleine Korrektur zu Thomas' Vorschlag bei nicht-statischen Elementen:
test::test(const test& _blubb) : copycounter(_blubb.copycounter + 1)
{ }
anderenfalls gibts eine const-Verletzung.
Besten Gruss aus Bremen,
Daniel Krügler
Daniel Kr�gler schrieb:
> Ja, du hast da etwas falsch verstanden.
*seufz*
Ich werde Eure Antworten ausdrucken und unter mein Kopfkissen legen.
Vielleicht hilft�s ja.
Wenn ich mich nach meinem Ableben in der H�lle wiederfinde, wird es da
sch�n sein (vorausgesetzt, es gibt dort keine Computer)
Danke!
Gregor
--
Life is a short trip. (Alphaville)
> Thomas Maeder schrieb:
>> Gregor Szaktilla <spa...@ktilla.de> writes:
>>> class test
>>> {
>>> private:
>>> unsigned short copycounter;
>>> public:
>>> test():copycounter(0){}; // Standardkonstruktor
>>> test(const test&); // Kopierkonstruktor, zaehlt copycounter hoch
>>> unsigned short getCc(); // Gibt copycounter zurueck
>>> };
>>>
>>> test::test(const test& _blubb) // Kopierkonstruktor
>>> { copycounter++; }
>>
>> Das hat undefiniertes Verhalten, weil copycounter da, wo er erhᅵht
>> werden soll, uninitialisiert ist,
>
> Hallo Thomas,
>
> obwohl ich copycounter in der Initialisierungsliste des
> Standardkonstruktors auf Null setze? Dann mᅵsste ich ein paar Dinge
> *grᅵndlich* falsch verstanden haben.
Du hast nur eines nicht verstanden: der Copykonstruktor ruft NICHT zuerst
den Standardkonstruktor. Es wird entweder der Copykonstruktor oder der
Standardkonstruktor gerufen (oder irgendein sonst noch definierter Konstruktor).
Du musst also in JEDEM Konstruktor die Membervariablen initialisieren.
Tschau
Andreas
--
Andreas Hᅵnnebeck | email: ac...@gmx.de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc