Ich arbeite an einem meiner Anwendungsproblem. Hier ist das Problem, mit dem ich konfrontiert bin, gibt es einige Funktionen, die ich mit dem Zeiger eines Klassenobjekts aufrufen muss.Adresse eines Objekts in C++ und seine Mitglieder
Aber das Hauptproblem ist, ich donot haben einen Klassenzeiger mit mir, stattdessen habe ich einen Mitgliedsvariablenwert (lassen Sie uns sagen, es ist eine Liste von Werten). Danach habe ich einen kleinen Test mit dem folgenden Code gemacht.
using namespace std;
class Person {
public:
Person(string name, int age) {
this->name = name;
this->age = age;
}
string getName() {
return name;
}
int getAge() {
return age;
}
void Print()
{
printf("This address is %x\n",this);
printf("age adress is %x\n",&age);
}
private:
int age;
string name;
};
int main() {
cout << "Creating a person..." << endl;
Person *johnDoe=new Person("John Doe", 25);
cout << "Person's name: " << johnDoe->getName() << endl;
cout << "Person's age: " << johnDoe->getAge() << endl;
johnDoe->Print();
delete johnDoe;
return 0;
}
Die coutput der Ausführung ist:
> ./a.out
Creating a person...
Person's name: John Doe
Person's age: 25
This address is 72918
age adress is 72918
Nun meine Zweifel:
Ist sichergestellt, dass die Adresse der Klassenvariable an die Adresse des Objekts zeigt immer? Kann ich diese Adresse für den Fall verwenden, dass ich den Zeiger für den Aufruf anderer Core-API-Funktionen verwenden muss?
Ich sah das, als ich googelte?
(C1x §6.7.2.1.13: "Ein Zeiger auf ein Strukturobjekt, entsprechend konvertiert, zeigt auf seinen Anfangsmember ... und umgekehrt. Möglicherweise gibt es ein unbenanntes Padding innerhalb als Strukturobjekt, aber nicht als sein Anfang. ")
ist das auch im Fall von C++ und Klassen wahr?
Siehe Offset des Makros. Nur für POD-Typen! –
Für jeden Klassentyp hat jedes Datenelement einen festen Offset-Wert.Dies ist nicht die Startadresse des Objekts, da der Compiler einige Dinge an die Spitze legt. Aber das wird anders, wenn Sie virtuelle Funktionen haben, da der Compiler das vptr * auch in das Objekt schreiben muss. Also mache ich es nicht generell gut, diesen Weg zu gehen. – madu
kann verwandt sein: http://stackoverflow.com/questions/8240273/a-portable-way-to-calculate-pointer-to-the-whole-structure-using-pointer-to-a-fi – user396672