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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

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

17.06.2012, 22:40. Просмотров 578. Ответов 8
Метки нет (Все метки)

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* ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2012, 22:40     Явное преобразование типов
Посмотрите здесь:

static_cast и явное преобразование типов - C++
Зачем нужен статик_каст, если можно явно преобразовывать типы?

Явное преобразование типов в UST - C++
Задание - реализовать универсальный скалярный тип (аля any/variant из буста). Я его написал, однако преобразование типов в моем коде...

Явное преобразование типов данных(объясните разницу)! - C++
В чём разница между этим: cout << "float(int_value15) / int_value2 = " << float(int_value15) / int_value2 << endl << "15 /...

Деления двух чисел используя явное преобразование типов - C++
Помогите кто может подкорректировать данную программу условие следующее "Деления двух чисел используя явное преобразование типов" Написал...

Явное преобразование типа в стиле С - C++
1) назовите направление преобразование ( из какого типа в какой ) 2) назовите точность преобразования (С потерей точности , без потери...

Как написать такое явное преобразование из double в unsigned long int - C++
как написать такое явное преобразование из double в unsigned long int??? спасибо всем кто поможет...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
17.06.2012, 22:43     Явное преобразование типов #2
Конкретно так можно только если в классе CLSObj будет явно перегружен оператор приведения к char* (хотя, в этой стороне C++ я не уверен). А вот если взять адрес от obj, то да, но это настоящее типонебезопасное самоубийство.
Ksan
27 / 27 / 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
26 / 26 / 2
Регистрация: 27.05.2012
Сообщений: 114
17.06.2012, 22:55     Явное преобразование типов #4
Цитата Сообщение от Ksan Посмотреть сообщение
И можно ли вместо char* использовать void* ?
наверное, преобразование в void может даже получиться. Но это очень не правильно.
Ksan
27 / 27 / 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
27 / 27 / 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     Явное преобразование типов
Еще ссылки по теме:

преобразование типов в с++ - C++
Собственно вопрос в следующем. Распишите пожалуйста по шагам что происходит при выполнении данного кода { //... myclass x(10);...

Преобразование типов - C++
Цель копировать из одного объекта в другой инофрмацию, типы разные, поэтому приходится приводитьTypeA a; TypeB b; a = *(a*)&b; А вот...

Преобразование типов - C++
Господа, мое терпение и срок, отведенный мне на решение задачи начальством, кончились. У меня одна функция возвращает один тип, а...

Преобразование типов в С++ - C++
Задача: Определить два класса, String с преобразованием из char * в строку и обратно. Мой код: #include <iostream> ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru