В C ++, как получить адрес, в котором хранится значение поля экземпляра класса? - PullRequest
1 голос
/ 29 июня 2009
class A {
   public: int i;
};

A *a = new A();

Как получить адрес a->i? Я пробовал &a->i, а также &(a->i), но они генерируют ошибки времени компиляции:

«Слева от« .i »должен быть тип class / struct / union»

Ответы [ 6 ]

8 голосов
/ 29 июня 2009

Вы не предоставили тот же код, который пытались скомпилировать. Всегда копировать и вставлять . В вашем коде говорится, что у вас нет синтаксически правильного объявления класса или объявления переменной, и что в вашем сообщении об ошибке говорится о «.i», когда вы заявляете, что используете только a->i. Вот рабочий код:

#include <stdio.h>
class A {
    public:
        int i;
};

int main() {
    A* a = new A();
    int* i = &a->i;
    printf("a: %p\na->i: %p\n", a, i);
    return 0;
}

В конечном счете, синтаксис, который вы говорите , который вы пытались получить для адреса участника, был верным. Синтаксис сообщения об ошибке говорит, что вы пробовали a.i. Это не работает, и по причине сообщения об ошибке дал. Переменная a не является классом, структурой или типом объединения. Скорее, это указатель на один из этих типов. Вам нужно разыменовать указатель, чтобы получить член.

Когда я запускаю его, я получаю это:

$ ./a.out
a: 40748
a->i: 40748

Адреса одинаковы, потому что A - простой класс, поэтому этот вывод следует ожидать. Первый член часто помещается в самом начале памяти класса. Добавьте в класс вторую переменную-член и получите ее адрес; тогда вы должны увидеть разные значения.

0 голосов
/ 29 июня 2009

Следующее работает для меня, используя g ++

class A
{
public:
    int m_i;
};

int
main()
{
    A* a = new A();
    int* i_ptr = &(a->m_i);

    return 0;
}

Я предполагаю, что вы имеете в виду A* a = ..., а не A a* = ...

0 голосов
/ 29 июня 2009

Этот код отображается для компиляции?

class A {
   public:
      int i;
};
int main() {
   A *a = new A();
   int *x = &a->i;
   return 0;
}
0 голосов
/ 29 июня 2009

Вы на правильном пути, но из-за ошибки компиляции, которую вы упомянули, похоже, что вы набрали "&a.i"

class A 
{
   public: 
       int i;
};

...

A *a = new A();
int *i = &a->i;
0 голосов
/ 29 июня 2009

& a-> я должен работать. В вашем случае, поскольку у класса только одно общедоступное целое число, адреса a и i будут одинаковыми.

0 голосов
/ 29 июня 2009

В c ++:

class A {
    public:         // note colon after public
        int i;
};                  // note semicolon after bracket

A *a = new A();     // note *a not a*

для печати:

cout << ios::hex << &a->i << endl;

Для меня это работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...