Verstehe die Aufgabe nicht... Bitte um Hilfe

Joe1903

Mitglied
Hallo zusammen,

ich habe folgende Aufgabe aus Stroustrup "Programming Language C++" gemacht:

"Define two classes, each with a static member,so that the construction of each static member involves a reference to the other.
Where might such constructs appear in real code?
How can these classes be modified to eliminate the order dependence in the constructors?"

Meine Lösung sah wie folgt aus:
C++:
#include <iostream>

using namespace std;

struct MemberB;

struct MemberA
{
        MemberB& x;
        MemberA();
};


struct MemberB
{
        MemberA& x;
        MemberB();
};


class ClassA
{
        public:
                static MemberA x;
};


class ClassB
{
        public:
                static MemberB x;
};


MemberA::MemberA() : x(ClassB::x)
{
        cout << "Call MemberA constructor" << endl;
}


MemberB::MemberB() : x(ClassA::x)
{
        cout << "Call MemberB constructor" << endl;
}


MemberA ClassA::x;

MemberB ClassB::x;


int main()
{
}

Nun bekam ich bei der Korrektur folgenden Kommentar:
Offensichtlich bin ich mit meinem Versuch, Dir die Bedeutung der Werte von Instanzvariablen
für diese Aufgabe zu erklären, gründlich gescheitert: Die Klassen haben keine Instanzvariablen.

Ich versteh jetzt nur noch Bahnhof.. Kann mir bitte jemand sagen, was genau gewollt wird?Vertseh ich die Aufgabe falsch?
 
Hi

Nun, dein Korrekteur scheint Instanzvariablen zu vermissen. Allerdings haben statische Klassen keine Instanzvariablen.

Wahrscheinlich kann dir dein TA besser helfen als wir.

Gruss
cwriter
 
Zuletzt bearbeitet:
Kann mir jemand bitte ein Beispiel geben,wie ich obige Aufgabe mit Instanzvariablen lösen kann??Ich denke um den Unterschied zwischen Instanzvariablen und static Variablen aufzuzeigen..
 
Kann mir jemand bitte ein Beispiel geben,wie ich obige Aufgabe mit Instanzvariablen lösen kann??
Äh? Am ehesten gar nicht?
Ich denke um den Unterschied zwischen Instanzvariablen und static Variablen aufzuzeigen..
Der Unterschied lässt sich recht leicht erklären:
Wenn du Code hast, z.b.
C++:
class C
{
public:
C();
int a;
};

C::C()
{
a=123;
}

//...
C c;
, dann ist das nur für den Compiler relevant.
Tatsächlich bekommst du als Code 2 verschiedene Dinge:
1) Die Definition, wie gross die Klasse sein muss, um alle Member zu speichern (hier: sizeof(int))
2) Die Funktionen, die auf die Klasse angewendet werden.

Im Prinzip ist obiger Code äquivalent zum C-Code:
C:
void init(void* ptr)
{
*((int*)ptr) = 123;
}
//...

//C c
int a;
init((void*)&a);
//a ist 123
Die Klasse im Speicher nennt man Instanz, d.h. hier ist a eine äquivalente Repräsentation von einer class C-Instanz im Speicher.

Das würde so auch reichen, du kannst jetzt ja auch globale Variablen definieren, wie man sie aus C kennt. Allerdings will C++ (zurecht) ordentlich sein, und deshalb kann man statische Variablen definieren. Diese sind "gescopte" globale Variablen.
Also ist die Klasse D:
C++:
class D
{
public:
D()
{
a=123;
}
int a;
static int b;
};

D::b = 0;
sogennant "binärkompatibel" mit der Klasse C. Der Grund: Die statischen Variablen haben eine eigene, einzige "Instanz" pro Programm.
sizeof(D) ist also gleich sizeof(C) == sizeof(int).
Dies ist natürlich nur der Fall, solange b ungenutzt ist, was nicht viel Sinn macht :)
Eine Instanz Klasse D liesse sich in C schreiben als
C++:
void init(void* ptr)
{
*((int*)ptr) = 123;
}
//...

int b; //als globale Variable

//...
int a;
init(&a);
Statische Variablen sind losgelöst von Instanzen, genaugenommen gilt: Wenn es eine statische Variable einer Klasse im Speicher gibt, gibt es nur eine einzige davon, unabhängig von der Anzahl der Klasseninstanzen.
Im Gegensatz zu: Wenn es n Instanzen einer Klasse gibt, dann gibt es jede (nicht-statische) Variable dieser Klasse n Mal im Speicher (die Werte müssen nicht gleich sein).

Ist das ein bisschen klarer geworden?

Gruss
cwriter
 
Äh? Am ehesten gar nicht?

Der Unterschied lässt sich recht leicht erklären:
Wenn du Code hast, z.b.
C++:
class C
{
public:
C();
int a;
};

C::C()
{
a=123;
}

//...
C c;
, dann ist das nur für den Compiler relevant.
Tatsächlich bekommst du als Code 2 verschiedene Dinge:
1) Die Definition, wie gross die Klasse sein muss, um alle Member zu speichern (hier: sizeof(int))
2) Die Funktionen, die auf die Klasse angewendet werden.

Im Prinzip ist obiger Code äquivalent zum C-Code:
C:
void init(void* ptr)
{
*((int*)ptr) = 123;
}
//...

//C c
int a;
init((void*)&a);
//a ist 123
Die Klasse im Speicher nennt man Instanz, d.h. hier ist a eine äquivalente Repräsentation von einer class C-Instanz im Speicher.

Das würde so auch reichen, du kannst jetzt ja auch globale Variablen definieren, wie man sie aus C kennt. Allerdings will C++ (zurecht) ordentlich sein, und deshalb kann man statische Variablen definieren. Diese sind "gescopte" globale Variablen.
Also ist die Klasse D:
C++:
class D
{
public:
D()
{
a=123;
}
int a;
static int b;
};

D::b = 0;
sogennant "binärkompatibel" mit der Klasse C. Der Grund: Die statischen Variablen haben eine eigene, einzige "Instanz" pro Programm.
sizeof(D) ist also gleich sizeof(C) == sizeof(int).
Dies ist natürlich nur der Fall, solange b ungenutzt ist, was nicht viel Sinn macht :)
Eine Instanz Klasse D liesse sich in C schreiben als
C++:
void init(void* ptr)
{
*((int*)ptr) = 123;
}
//...

int b; //als globale Variable

//...
int a;
init(&a);
Statische Variablen sind losgelöst von Instanzen, genaugenommen gilt: Wenn es eine statische Variable einer Klasse im Speicher gibt, gibt es nur eine einzige davon, unabhängig von der Anzahl der Klasseninstanzen.
Im Gegensatz zu: Wenn es n Instanzen einer Klasse gibt, dann gibt es jede (nicht-statische) Variable dieser Klasse n Mal im Speicher (die Werte müssen nicht gleich sein).

Ist das ein bisschen klarer geworden?

Gruss
cwriter

Als erstes möchte ich mich wirklich bedanken,dass du dir soviel Mühe machst für die Erklärung.
Ich habe den Unterschied zwischen statischen Variablen und Instanzvariablen verstanden.Was ich nicht verstehe ist,was würde müsste mein obiger Code aussehen wenn ich Instanzvariablen einbaue?
Er will das unbedingt sehen,aber ich check nicht,was er erreichen will..
 
Was ich nicht verstehe ist,was würde müsste mein obiger Code aussehen wenn ich Instanzvariablen einbaue?
Er will das unbedingt sehen,aber ich check nicht,was er erreichen will..
Naja. Wie jetzt nur noch mit (nutzlosen) Instanzvariablen?
Ich habe zumindest keinen Schimmer, was dein TA will. Jedenfalls nicht bei der Aufgabenstellung, die du angegeben hast. Am besten fragst du ihn direkt, was er gemeint hat. (Ausser, jemand hier im Forum hätte noch einen Geistesblitz(?)).

Gruss
cwriter
 
Zurück