Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> небольшая задачка 
V
    Опции темы
Alek86
Дата 18.3.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Задачка по чистым C++, потому сюда и кидаю.
Если кто знает ответ или задача покажется слишком элементарной, просьба восхищаться собой молча smile

Есть класс

Код

class C {
 //...
public:
 C* operator&() {return NULL;}
 //...
};


Можно ли взять адрес у экземпляра этого класса? Если да, то как?
Решение должно быть по стандарту С++, работать на любых платформах и т.п.


--------------------
user posted image    user posted image
PM MAIL   Вверх
korian
Дата 18.3.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



не знаю, является ли это правильным решением, но вот что у меня получилось:
Код

C obj;
const C& constObj = obj;
const C* objptr = &constObj;

PM   Вверх
Alek86
Дата 18.3.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



тут раньше сморозил...

Это сообщение отредактировал(а) Alek86 - 18.3.2008, 12:34


--------------------
user posted image    user posted image
PM MAIL   Вверх
MAKCim
Дата 18.3.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



РЕШЕНИЕ ВНИЗУ!!!







&static_cast<const C&>©


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
korian
Дата 18.3.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



да проверил, работает, т.к. оператор не константный.
а вот если еще добавить константный оператор - тада я хз вообще.
Код

class C {
 //...
public:
 C* operator&() {return NULL;}
 C* operator&() const {return NULL;}
 //...
};

PM   Вверх
MAKCim
Дата 18.3.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alek86 @  18.3.2008,  12:32 Найти цитируемый пост)
вызовется C* operator&() {return NULL;} 

нет


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 18.3.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



ну, пусть будет добавлен - про константность забыл :(

в оригинале звучало: класс, у которого переопределен опратор &

Это сообщение отредактировал(а) Alek86 - 18.3.2008, 12:39


--------------------
user posted image    user posted image
PM MAIL   Вверх
korian
Дата 18.3.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



нашел решение.






static_cast<C*>(static_cast<C&>(obj))

Это сообщение отредактировал(а) korian - 18.3.2008, 12:51
PM   Вверх
MAKCim
Дата 18.3.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

#include <iostream>

class C {
public:
 C* operator&() {return NULL;}
 C * operator&() const {return NULL;}
};

class A {};

int main() {
    C c;
    std :: cout << (&reinterpret_cast<A&>(c)) << std :: endl;
    return 0;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
korian
Дата 18.3.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



MAKCim
размер указателя на A и размер указателя на C могут отличаться, так что есть вероятность потерять часть данных
PM   Вверх
Alek86
Дата 18.3.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(korian @  18.3.2008,  12:50 Найти цитируемый пост)
нашел решение.

разве можно статиккастить так?

Добавлено через 4 минуты и 55 секунд
Цитата(korian @  18.3.2008,  12:52 Найти цитируемый пост)
размер указателя на A и размер указателя на C могут отличаться, так что есть вероятность потерять часть данных

ты уверен? в каком случае?

у меня решение было похожее (только A был наследником C и статик каст использовался)


--------------------
user posted image    user posted image
PM MAIL   Вверх
mes
Дата 18.3.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вот что нашел :

Функция addressof() возвращает адрес объекта.

...

C++ разрешает программисту заменять унарный оператор в классе operator&() для получения адреса объекта. Получение истинного адреса объекта требует неуклюжих тюков с преобразованием (casting), чтобы избежать вызова перегруженного оператора  operator&(). Функция addressof() обеспечивает обертку для необходимого кода< чтобы упростить получение истинного адреса объекта. 

...

Пример

Код

#include <boost/utility.hpp>

struct useless_type {};
class nonaddressable {
  useless_type operator&() const;
};

void f() {
  nonaddressable x;
  nonaddressable* xp = boost::addressof(x);
  // nonaddressable* xpe = &x; /* error */
}



--------------------
PM MAIL WWW   Вверх
Alek86
Дата 18.3.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



хехе

Код

template <typename T> T*
addressof(T& v)
{
  return reinterpret_cast<T*>(
       &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
}  


думаю, это и есть решение... smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
korian
Дата 18.3.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(Alek86 @  18.3.2008,  12:10 Найти цитируемый пост)
разве можно статиккастить так?

на борланде 6.0 работает  smile 

Цитата(Alek86 @  18.3.2008,  12:10 Найти цитируемый пост)
ты уверен? в каком случае?

в C++ гарантируется только то что в void* влезит любой указатель, размер остальных указателей может быть любым.
умные люди пишут, что если вы уж решились использовать reinterpret_cast, то лучше делать это так:
int* intptr = reinterpret_cast<int*>(static_cast<void*>(objptr));
насчет "с наследованием" не знаю, поидее тоже должны как-то транслироваться друг в друга. вот только не известно должно ли оно работать, если приводить к наследнику, а сам объект является базовым классом... поидее это не правильно, т.к. получился указатель, на объект которого не существует.

Цитата(mes @  18.3.2008,  12:36 Найти цитируемый пост)
boost::addressof(x);

ну да... чистый C++ ...
PM   Вверх
Alek86
Дата 18.3.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(korian @  18.3.2008,  13:54 Найти цитируемый пост)
в C++ гарантируется только то что в void* влезит любой указатель, размер остальных указателей может быть любым.

то есть реализация бустовского addressof некроссплатформенна?

Цитата(korian @  18.3.2008,  13:54 Найти цитируемый пост)
должно ли оно работать, если приводить к наследнику, а сам объект является базовым классом...

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

Это сообщение отредактировал(а) Alek86 - 18.3.2008, 14:22


--------------------
user posted image    user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1128 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.