Всплыла интересная задачка class CORef; class CORef { int data; public: CORef () { data = 31; } CORef* operator &() { return ((CORef*) 5); } }; А где нибудь объявлено CORef dummy; Как получить адрес dummy не прибегая к асм вставкам? Отсюда http://vkontakte.ru/board.php?act=topic&tid=6733893
вы об этом Код (Text): class Foo{ public: operator Foo*(){return this;} }; //test Foo f; Foo *pFoo = f; ? хотя, не совсем ясен смысл получения адреса объекта, созданного на стеке. по окончании его жизни pFoo будет указывать в космос. updated: и потом, зачем все эти сложности, если можно: Код (Text): Foo *pFoo = &f;
Ага, а если первый член класса private (даже отредактировал первый пост=)? Нужен то универсальный метод. Да не важен практический смысл, считайте это.. теоретической задачкой.
Vilco так вам нужен адрес поля объекта или же адрес самого объекта? если второе, то неясно, чем не устраивает предложенный вариант выше.
Нельзя так. Кроме того, что С-cast применённые к объекту - это UB, так ещё и внутренние данные сюда замешивать Не учи людей плохому В этом случае вот Foo *pFoo = &f; не работает?
Ну тогда что-то вроде этого. )) Код (Text): CORef dummy; CORef *pDummy = 0; pDummy = (CORef*)(&pDummy+3); W4FhLF Чего? Я применил каст в указателю. И при чём здесь С-cast?
Тогда уж лучше CORef dum; CORef* pdum; dd = (CORef*)((unsigned int)&pdum + sizeof(CORef)); Но некрасиво както, чтож я каждый раз вручную смещение буду считать? Можно ли путем каких-либо хитрых манипуляций с идентификатором dum это сделать?
На самом деле можно сделать метод GetPtr. Но я думал что это задачка для ума. -) Код (Text): CORef dum; CORef* pdum; dd = (CORef*)((unsigned int)&pdum + sizeof(CORef)); Боюсь что здесь всё несколько сложнее, ибо во первых стек растёт с сверху вниз, и ещё тут надо учитывать как это делает конкретный компилятор и как происходит выравнивание. )
Vilco а тебе принципиально нужно, чтобы член int data был размещен в private-секции класса Foo и чтобы обойтись без геттера? ) ежели хочется таких извращений, то придется воспользоваться reinterpret_cast: Код (Text): class Foo{ int _data; public: Foo(int data):_data(data){} void printData() const{ printf("_data=%d\n", _data); } }; // Foo f(666); Foo *pFoo = &f; int data_offset = 0; int& i = *reinterpret_cast<int*>(reinterpret_cast<size_t>(pFoo) + data_offset); i = 777; pFoo->printData(); // 777 про портируемость и надежность этого хака я промолчу. а вообще, если бы у нас был не класс а, скажем, структура, то можно было бы смещение _data вычислить через макрос offsetof, определенный в хидере <cstddef>
бррр.. ежели не требуется получить доступ к приватным членам, то нафига городить огород? Код (Text): Foo f; Foo *pFoo = &f; получили адрес объекта f, созданного на стеке. какая нам разница, какова его внутренняя структура, если более от нас ничего не требуется? вообще, не топик, а сумбур какой-то.
если этот изврат по изменению приватных данных класса извне вам нужен, то можно еще поглядеть на неск. реализаций: http://cppforeach.wordpress.com/2008/05/19/around_access_modifiers/ ps: на самом деле имхо это нафик не надо и представляет из себя сугубо имхо эстетический интерес. на практике за такое надо бить линейкой по рукам.
Vilco теперь ясно. я не знал что вам нужно чтобы в классе обязательно присутствовал Код (Text): CORef* operator &() { return ((CORef*) 5); } это называется -- мы успешно решаем проблемы, которые сами же и придумываем не в обиду