Адрес объекта в функции c ++ - PullRequest
0 голосов
/ 23 февраля 2012

вопрос в том, как получить указатель на собственный метод внутри класса, не касаясь this:

class Foo
{
   int a, b, c;
   void Print();
};

Таким образом, в обычном компиляторе я могу сделать это, ссылаясь на первое поле данных:

void Foo::Print()
{
   cout << &a; // == this
}

Но есть ли способы сделать это без элементов данных, когда существует только функция?

class Foo2
{
   void Print();
};

ps даже не спрашивают меня, зачем мне это нужно:)

Ответы [ 4 ]

4 голосов
/ 23 февраля 2012

Для класса POD с хотя бы одним членом данных адрес объекта типа класса совпадает с адресом его первого члена данных. Это связано с тем, что не может быть безымянных байтов заполнения перед первым элементом данных структурного типа POD. [В C ++ 11 правила немного отличаются; Я считаю, что это верно для всех стандартных макетов типов классов. Однако я не совсем знаком с правилами.]

Для любого другого типа класса сделать это невозможно.

2 голосов
/ 23 февраля 2012
class Foo2
{
   void Print();
};

#define OBJADDR(x) (th##x##s)

void Foo2::Print()
{
    int i; // red herring, but the name MUST be `i`
    std::cout << OBJADDR(i);
    i; // to get rid of compiler warning about unused local variable
};
1 голос
/ 23 февраля 2012

Если в вашем классе нет членов данных, то технически экземпляры этого класса даже не существуют.Только для удобства они должны иметь размер не менее 1 байта и иметь уникальные указатели this.Если вы наследуете от класса без элементов данных, его размер уменьшается до 0 и исчезает.

Так что нет, нет способа получить указатель this без использования указателя this.Менее прагматичная версия C ++ даже не имела бы указателей this для этих объектов, поскольку они имели бы размер 0.

0 голосов
/ 23 февраля 2012

Вы можете вероятно взломать его с помощью макроса offsetof

void Foo::Print()
{
   cout << static_cast<char *>(&a) - offsetof(Foo, a);
}

, если вы не можете предположить, что &a - это начало.

Итак ... зачем тебе это делать?

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