Поля объекта расположены по порядку? - PullRequest
0 голосов
/ 24 мая 2018

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

Пример, который работал для меня:

struct Rectangle
{
    int len;
    int wid;
};

Rectangle* myRect = new Rectangle;
void* vPtr = myRect;

Будет ли *(int*)(vPtr) всегда эквивалентен myRect->len и *(int*)(vPtr + sizeof(int)) эквивалентен myRect->wid?

Будет лиТо же самое происходит и в этом случае?

class Button
{
     Rectangle* frame;
     Char* Text;
} *myButton;
void * vButton = myButton;

Будет ли *(int*)((*Rectangle)(vButton)) полем len?

Поскольку я не хочу большую книгу в качестве ответа, я спрошуследующий вопросКогда у меня будет больше таких классов:

#define WND_BUTTON 1
#define WND_EDIT   2
class Button
{
    private:
        BYTE TypeWindow;
        SMALL_RECT srFrame;
        *Some other fields*
    public:
        Button();
        *Just functions here*
}
class Edit
{
    private:
        BYTE TypeWindow;
        SMALL_RECT srFrame;
        /*Some other fields*/
    public:
        Edit();
        /*Just functions here*/
}

typedef void* HANDLE;

Могу ли я рассчитывать на эту проверку?

HANDLE hWindow = Create(...);

if (*(BYTE*)(hWindow) == WND_BUTTON)
    std::cout<<"This is a button."<<std:endl;
if (*(BYTE*)(hWindow) == WND_EDIT)
    std::cout<<"This is a text field."<<std:endl;
...