Re[2]: указатель на под-член
От: Pavel Dvorkin Россия  
Дата: 16.12.09 13:49
Оценка:
Здравствуйте, tyomitch, Вы писали:

T>Коллеги, возник ещё один вопрос по теме.

T>Как сделать указатель на "невидимый член" базового класса?
T>К примеру:

T>
T>struct A { float w; int x; } ;
T>struct B { char y; } ;
T>struct C : public A, public B { } ;
T>B C::* p;
T>C c;
T>


T>И цель — чтобы c.*p было эквивалентно (B)c


T>Опять же, кажется, что можно изхитриться и узнать смещение предка в потомке, а по нему сконструировать указатель?


Можно, конечно. Я специально слегка усложнил — переставил местами родителей


#include "stdafx.h"
#include "stddef.h"

struct A { float w; int x; } ;
struct B { char y; } ;
struct C : public B, public A { } ;

int _tmain(int argc, _TCHAR* argv[])
{
    // хочу доступ к C::A::x

    C c;
    B* pB = (B*)&c;
    A* pA = (A*)&c;
    int offsetAinC = (char*) pA - (char*) pB; // а вот в этом быть уверенным я не могу ИМХО. Или могу ? Знатоки стандарта, ответьте!
    int mem = offsetAinC + offsetof(A,x) ;
    int C::* p = (int C::*&) mem;
    c.*p = 123;
    return 0;
}


Но вообще — безобразие все это. Грязный хак, вполне согласен с rg45.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.