Tôi đang xử lý một trong các vấn đề về ứng dụng của mình. Ở đây vấn đề tôi đang phải đối mặt là có một số chức năng mà tôi cần phải gọi bằng cách sử dụng con trỏ của một đối tượng lớp.Địa chỉ của một đối tượng trong C++ và các thành viên của nó
Nhưng vấn đề chính là tôi không có một con trỏ lớp với tôi, thay vào đó tôi có một giá trị biến thành viên (cho phép nói một danh sách các giá trị của nó). sau này tôi đã làm một thử nghiệm nhỏ với các mã dưới đây.
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;
}
Các COutput việc thực hiện là:
> ./a.out
Creating a person...
Person's name: John Doe
Person's age: 25
This address is 72918
age adress is 72918
Bây giờ nghi ngờ của tôi là:
Có đảm bảo rằng địa chỉ của biến thành viên lớp luôn trỏ tới địa chỉ của đối tượng? Tôi có thể sử dụng địa chỉ này trong trường hợp tôi cần sử dụng con trỏ để gọi các chức năng api lõi khác không?
Tôi thấy điều này khi tôi googled?
(C1x §6.7.2.1.13: "Con trỏ đến đối tượng cấu trúc, được chuyển đổi phù hợp, điểm thành thành viên ban đầu của nó ... và ngược lại. Có thể có đệm không tên trong đối tượng cấu trúc, nhưng không bắt đầu của nó. ")
điều này đúng ngay cả trong trường hợp của C++ và các lớp học?
Xem macro bù đắp. Chỉ dành cho các loại POD! –
Đối với mỗi loại lớp, mọi thành viên dữ liệu sẽ có giá trị bù đắp cố định.Đây không phải là địa chỉ bắt đầu của đối tượng khi trình biên dịch đặt một số thứ ở trên cùng. Nhưng điều này sẽ khác khi bạn có các hàm ảo vì trình biên dịch cũng cần đặt vptr * vào đối tượng. Vì vậy, tôi không thực hành tốt thường để làm theo cách này. – madu
có thể liên quan: http://stackoverflow.com/questions/8240273/a-portable-way-to-calculate-pointer-to-the-whole-structure-using-pointer-to-a-fi – user396672