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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение к элементу класса без type casting 
:(
    Опции темы
lxx
Дата 25.7.2011, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую!
Есть void* с переменной класса типа этого:

Код

class someclass: public class2<someclass> {
 public:
  someclass();
  explicit someclass(int data_size);

  char* data() { return data_; }
  explicit someclass(char* data);
  virtual ~someclass();
  char* data_;
};


Можно-ли получить из этого войда содержимое переменной data_, не объявляя самого класса и не кастуя войд в него?

Есть предположение, что можно это сделать как-то так по смещению:
Код

char *buf = (char*)(void_with_class+n)

Но как вычислить это смещение?

Это сообщение отредактировал(а) lxx - 25.7.2011, 21:38
PM MAIL   Вверх
VirtualVoid
Дата 25.7.2011, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Цитата(lxx @  26.7.2011,  02:37 Найти цитируемый пост)
char *buf = (char*)(void_with_class+n)

Наверно, не скомпилится.
Нужно хотя-бы так:

Код

char *buf=(((char*)void_with_class)+n)


Т.е. сначала кастуем, а потом, зная размер содержимого указателя(в нашем случае char), компилятор сможет прибавить целое число к указателю.
Если не кастануть до прибавления, то откуда компилятору знать, сколько прибавлять к этому указателю? Ведь когда мы пишем:
Код

T *ptr=<что-то>;
int n=<что-то еще>
ptr+=n;

То указатель сдвигается на sizeof(T)*n адресуемых ячеек (байты на популярных архитектурах), а sizeof(void) не определен.

Но зачем всё это? Это же небезопасно и жутко непереносимо!
Результат может различаться даже при компиляции разными компиляторами на одной архитектуре.

Хотя.. смещение можно попробовать вычислить в рантайме примерно так:
Код

someclass ob;
int shift = (int)&ob.data_) - ((int)&ob);
//для х64 будет long long вместо int


Но все-равно это бред,  особенно учитывая, что компиляторы любят выравнивания, а здесь еще присутствует наследование от шаблонного(!) класса.

PM MAIL ICQ   Вверх
volatile
Дата 25.7.2011, 23:16 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



Цитата(lxx @  25.7.2011,  21:37 Найти цитируемый пост)
Можно-ли получить из этого войда содержимое переменной data_, не объявляя самого класса и не кастуя войд в него?

Аналогичный вопрос:
Можно ли одеть штаны, но без помощи рук, и через голову.

возникает вопрос: ЗАЧЕМ?
PM MAIL   Вверх
xvr
Дата 28.7.2011, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Есть стандартный макрос offsetof который как раз и возвращает смещение поля в структуре. gcc на применение такого макроса к классам (не POD) вопит благим матом, и видимо не зря  smile 

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

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

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

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

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


 




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


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

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