Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Verständnisproblem(e)

8 views
Skip to first unread message

Gregor Szaktilla

unread,
Oct 11, 2011, 5:46:47 AM10/11/11
to
Hallo zusammen!

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.

Thomas Maeder

unread,
Oct 11, 2011, 1:06:45 PM10/11/11
to
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,


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 ---

Gregor Szaktilla

unread,
Oct 11, 2011, 5:05:55 PM10/11/11
to
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.

Gruß

Gregor


--
Ich sehe ja ein, dass es auf unserer komischen Kugel wenigstens einen geben
muss, der normal ist. Aber warum ausgerechnet ich?!

Daniel Krügler

unread,
Oct 12, 2011, 5:57:11 PM10/12/11
to
On 11 Okt., 23:05, Gregor Szaktilla <spam...@ktilla.de> wrote:
> obwohl ich copycounter in der Initialisierungsliste des
> Standardkonstruktors auf Null setze? Dann müsste ich ein paar Dinge
> *gründlich* falsch verstanden haben.

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

Gregor Szaktilla

unread,
Oct 12, 2011, 7:58:47 PM10/12/11
to
Hallo Daniel,

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)

Andreas Huennebeck

unread,
Oct 13, 2011, 3:32:38 AM10/13/11
to
Gregor Szaktilla wrote:

> 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

Gregor Szaktilla

unread,
Oct 14, 2011, 12:55:29 PM10/14/11
to
Hallo Andreas,

Andreas Huennebeck schrieb:
> Du hast nur eines nicht verstanden: ...

Du liegst leider falsch. Auf den Standardkonstruktor bezog ich mich, weil
ich number_one als „Kopiervorlage“ benutzt habe und bei diesem
kam der Standardkonstruktor zum Zug.

Mein Fehler war, dass ich davon ausgegangen bin, dass bereits dann eine
Kopie erzeugt wird, wenn die Signatur eines Kopierkonstruktors angetroffen
wird. Daher habe ich auch den Namen des Parameters so gewählt. „_blubb“
verwende ich sonst nicht (es sei denn, ich blödle). Ich dachte, dass dieser
Bezeichner nur vorhanden sein muss, damit eine korrekte Signatur zustande
kommt.

Naja, jetzt hab’ ich’s wohl kapiert.

Gruß

Gregor

--
Das Gewissen ist fähig, Unrecht für Recht zu halten, Inquisition für Gott
wohlgefällig und Mord für politisch wertvoll. Das Gewissen ist um 180 Grad
drehbar. (Erich Kästner)
0 new messages