Verschachtelte New-Klasse > Cast To *Void > fehlende Member?

13/10/2014 - 11:09 von Heinz-Mario Frühbeis | Report spam
Hallo,

ich versuche es mal zum beschreiben:

Header hMyPairVector.h:
template <class t_VecMember>
std::pair <std::String, t_VecMember> pairMember;
std::vector <pairMember> mVector;
int Count(){
return (int) myVector.size();
}

class classA;
typedef hMyPairVector <classA*> tdPairVector;
class classA{
public:
std::string mKey; // z. Bsp. "Hallo"
std::vector vecTest; // beinhaltet z. Bsp. "Hallo" und "Du", also 2 Member
tdPairVector mPairVector; // beinhaltet z. Bsp. 3 x classA per New erstellt
}

void EineFunktion(){
classA nClassRoot;
classA *ptrClassA;
classA nClassA;
void *nVoid;
classA *voidClassA;

ptrClassA = nClassRoot.mPairVector[1];
nClassA = *ptrClassA;
std::cout << nClassA.mKey; // Ausgabe ist "Hallo"; OK!
std::cout << nClassA.vecTest,size(); // Ausgabe ist 2; OK!
std::cout << nClassA.mPairVector.Count(); // Ausgabe ist 3; OK!

// [1] Und dann cast zu *void:
nVoid = static_cast <void*> (&nClassA);
voidClassA = static_cast <classA*> (nVoid);
std::cout << voidClassA->mKey; // Ausgabe ist "Hallo"; OK!
std::cout << voidClassA->vecTest,size(); // Ausgabe ist 2; OK!
// Und jetzt:
std::cout << voidClassA->mPairVector.Count(); // Ausgabe ist jetzt aber
0 anstatt 3!
}

Es liegt wohl am cast zu *void...denke ich mal.
Aber wieso ist bei [1] mKey == "Hallo", vecTest,size() == 2, _aber_
mPairVector.Count() == 0?
Und wie kriegt man das hin, das mPairVector.Count() quasi "wieder" == 3 ist?
Ich habe einiges hin und her probiert und zum Test dann den Vector
vecTest in classA eingebaut um zu sehen, ob da dann nach cast zu *void
die von mir erwartete Ausgabe (== 2) kommt. Nachdem bei vecTest sowohl
als auch size() == 2 ausgegeben wird, entschloss ich mich bei euch
anzufragen...


Mit Gruß
Heinz-Mario Frühbeis
 

Lesen sie die antworten

#1 Rainer Weikusat
13/10/2014 - 15:21 | Warnen spam
Heinz-Mario Frühbeis writes:
ich versuche es mal zum beschreiben:

Header hMyPairVector.h:
template <class t_VecMember>
std::pair <std::String, t_VecMember> pairMember;
std::vector <pairMember> mVector;
int Count(){
return (int) myVector.size();
}

class classA;
typedef hMyPairVector <classA*> tdPairVector;
class classA{
public:
std::string mKey; // z. Bsp. "Hallo"
std::vector vecTest; // beinhaltet z. Bsp. "Hallo" und "Du", also 2 Member
tdPairVector mPairVector; // beinhaltet z. Bsp. 3 x classA per New erstellt
}

void EineFunktion(){
classA nClassRoot;
classA *ptrClassA;
classA nClassA;
void *nVoid;
classA *voidClassA;

ptrClassA = nClassRoot.mPairVector[1];
nClassA = *ptrClassA;
std::cout << nClassA.mKey; // Ausgabe ist "Hallo"; OK!
std::cout << nClassA.vecTest,size(); // Ausgabe ist 2; OK!
std::cout << nClassA.mPairVector.Count(); // Ausgabe ist 3; OK!

// [1] Und dann cast zu *void:
nVoid = static_cast <void*> (&nClassA);
voidClassA = static_cast <classA*> (nVoid);
std::cout << voidClassA->mKey; // Ausgabe ist "Hallo"; OK!
std::cout << voidClassA->vecTest,size(); // Ausgabe ist 2; OK!
// Und jetzt:
std::cout << voidClassA->mPairVector.Count(); // Ausgabe ist jetzt
aber 0 anstatt 3!
}



Das einzige, was man dem sicher entnehmen kann, ist das obiges
garantiert nicht identisch mit dem tatsaechlich benutzten Code ist
(Count benutzt myVector wo wohl mVector gemeint war, hMyPairVector ist
nirgends definiert).

Es liegt wohl am cast zu *void...denke ich mal.



Fuer alle praktischen Zwecke ist ein Zeiger eine vorzeichenlose Ganzzahl
und dieses ganze Gepfriemel dient nur dazu, von dieser Tatsache
abzulenken, weil sie manchen Leuten unbequem ist[*]. Insofern ist

nVoid = static_cast <void*> (&nClassA);

nichts weiter als eine Aufforderung an den Compiler, den Mund zu
halten. Insofern kann diese 'Anweisung', wenigstens im skizzierten
Kontext, den beschriebenen Effekt nicht hervorrufen.

Vielleicht hilfreich: Man koennte Count so ergaenzen, das this via
std::cerr ausgeben wird.

[*] 'Uebliche Muellsammelalgorithmen' (garbage collectionb), setzen
vorraus, das Zeiger magische Kekse sind, und keine Zahlenwerte, die auch
woanders als im Hauptspeicher aufgehobnen werden koennen.

Ähnliche fragen