Форум программистов, компьютерный форум CyberForum.ru

Явное преобразование типов - C++

Восстановить пароль Регистрация
 
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
17.06.2012, 22:40     Явное преобразование типов #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CLSObj
{
void abc(int d){ ... }
...
};
 
int main()
{
  char *p;
  CLSObj obj;
  p = (char*)obj;
  
  ((CLSObj)(*p)).abc(10);
 
  return 0;
}
Собственно вопрос. Можно ли так делать?
И можно ли вместо char* использовать void* ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
17.06.2012, 22:43     Явное преобразование типов #2
Конкретно так можно только если в классе CLSObj будет явно перегружен оператор приведения к char* (хотя, в этой стороне C++ я не уверен). А вот если взять адрес от obj, то да, но это настоящее типонебезопасное самоубийство.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
17.06.2012, 22:51  [ТС]     Явное преобразование типов #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CLSObj
{
void abc(int d){ ... }
...
};
 
int main()
{
  void *p;
  CLSObj obj;
  p = (char*)obj;
  
  ((CLSObj)(*p)).abc(10);
 
  return 0;
}
То есть вот так сделать можно? Но почему это "самоубийство"?
К тому же типонебезопасное?
Hrundel
25 / 25 / 2
Регистрация: 27.05.2012
Сообщений: 114
17.06.2012, 22:55     Явное преобразование типов #4
Цитата Сообщение от Ksan Посмотреть сообщение
И можно ли вместо char* использовать void* ?
наверное, преобразование в void может даже получиться. Но это очень не правильно.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
17.06.2012, 22:57  [ТС]     Явное преобразование типов #5
Hrundel, объясните, почему?
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
17.06.2012, 22:59     Явное преобразование типов #6
Цитата Сообщение от Ksan Посмотреть сообщение
Код C++1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class CLSObj { void abc(int d){ ... } ... }; int main() { void *p; CLSObj obj; p = (char*)obj; ((CLSObj)(*p)).abc(10); return 0; }
То есть вот так сделать можно? Но почему это "самоубийство"?
К тому же типонебезопасное?
Дело не в void, дело во взятии адреса объекта. Объект нельзя привести к указателю напрямую, адрес объекта можно.

Самоубийство потому что типы не просто так придуманы. Типы позволяют избавиться от многих косяков, связанных с приведением. А так, играясь с указателями, можно в конце концов продублировать переменную/не туда приравнять/не там привести и получить разыменование null и прочие радости. А еще можно на радостях сложить адреса и вообще вылезти за адресное пространство.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
17.06.2012, 23:02  [ТС]     Явное преобразование типов #7
Ну если делать аккуратно, то корректно ли будет работать код?

C++
1
2
3
void *p = &(void)obj;
 
(CLSObj(*p)).func(...);
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
17.06.2012, 23:08     Явное преобразование типов #8
Цитата Сообщение от Ksan Посмотреть сообщение
Ну если делать аккуратно, то корректно ли будет работать код?

Код C++1 2 3 void *p = &(void)obj; (CLSObj(*p)).func(...);
Так можно делать только high-level кодерам. А вы, судя по неумению брать адрес переменной, не из таких. Так что лучше не надо. Разве что вам надо передать какую-то приблуду в pthread_create и прочие — там не обойтись, да.

Работать будет только если напишете
C++
1
2
void* p = (void*)&obj;
(*(CLSObj*)(p)).func();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2012, 23:12     Явное преобразование типов
Еще ссылки по теме:

как написать такое явное преобразование из double в unsigned long int C++
static_cast и явное преобразование типов C++
C++ Преобразование типов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
17.06.2012, 23:12  [ТС]     Явное преобразование типов #9
Jtalk, Спасибо, учту. Просто это мне сильно облегчит написание проекта
Yandex
Объявления
17.06.2012, 23:12     Явное преобразование типов
Ответ Создать тему
Опции темы

Текущее время: 01:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru