Кто-нибудь может объяснить значение этого выражения? - PullRequest
0 голосов
/ 13 мая 2010
 void* GetData()
 {
    return reinterpret_cast<unsigned char*>(this);
 }

Существует ли случай автоматического принуждения типов в этом случае ??? Как я могу преобразовать объект моего класса в беззнаковый символ * ??

Ответы [ 4 ]

6 голосов
/ 13 мая 2010

Я полагаю, вы ссылаетесь на return reinterpret_cast<unsigned char*>(this);

Это неприятный кусок, который, вероятно, использует неправильный подход в решении неправильной проблемы. Технически, он просит компилятор повторно интерпретировать тип указателя this как указатель unsigned char*. Здесь не делается никакой работы: оператор только указывает компилятору думать о указателе как о другом типе. Это губительно, если неправильно интерпретировать тип как таковой.

Если вы хотите проверить свой объект побитово, вы можете попробовать что-то вроде этого:

union inspect_klass {
    klass obj;
    char bits[sizeof(klass)];
};

РЕДАКТИРОВАТЬ: Моя уверенность в вышеуказанном союзе сейчас поколеблена. Пока не используйте его, я ищу подтверждение, что этот трюк действительно сломан. : S

1 голос
/ 13 мая 2010

Я согласен с другими постами: это почти наверняка не то, что вы намереваетесь делать.

Однако , IIRC, вы гарантированы стандартом C ++, чтобы иметь возможность преобразовывать указатель любого типа (не включая указатели на функции или элементы) в unsigned char * или void * и обратно без входа в царство неопределенного поведения. Кроме того, вы можете получить доступ к любому объекту через lvalue типа char * или unsigned char * (см. ISO 14882: 2003 раздел 3.10.15). Я использовал это раньше для проверки внутреннего представления произвольных типов объектов. В результате, если мое прочтение стандарта правильно, это приводит к «поведению, определяемому реализацией» (очевидно, внутреннее представление типов зависит от реализации).

Например,

template<class T> std::vector<unsigned char> to_bytes (const T& t)
{
    const unsigned char *p = reinterpret_cast<const unsigned char *>(&t);
    return std::vector<unsigned char>(p, p + sizeof(T));
}

- это шаблонная функция, которая выдаст std::vector<unsigned_char>, которая является копией внутреннего представления объекта.

Однако тот факт, что вы возвращаетесь к void *, когда возвращаетесь, заставляет меня подозревать, что вы делаете что-то более сомнительное и более неопределенное.

0 голосов
/ 13 мая 2010

Строго говоря, unsigned char * - это байтовый массив. Это выглядит вполне логичным, если вызывающая сторона собирается сериализовать данные.

0 голосов
/ 13 мая 2010

Во-первых, ваш тип возвращаемого значения GetData () не соответствует типу возвращаемого выражения.

reinterpret_cast похож на старый C-бросок старого стиля - вы просто возвращаете указатель на неподписанный символ *. Это совершенно небезопасно. По сути, вы создаете представление данных класса, к которому можно обращаться побайтово.

...