|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
04.07.2013, 13:31 | #1 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 29
|
Преобразование типов.
Допустим есть структура:
typedef struct tagMyStruc { /// blabla }MyStruct, *pMyStruct; из нее производим класс: class MyClass: public OtherClass, public MyStruct { ..... необходимо создать операторы приведения к MyStruct, я их делаю следующим образом: operator pMyStruct(); operator const pMyStruct() const; Проблема: первый вызывается по умолчанию, второй - нет, хотя прямой вызов типа: pImpl->operator const pMyStruct() - проходит. Есть тут ошибка, или это глюки компилятора (VS2008)?! Спасибо! |
04.07.2013, 14:08 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
оператор приведения к указателю на родительский класс?
что за изврат? приведение к родителю итак доступно по умолчанию. в вашем же случае надо смотреть и код в котором применяли. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
04.07.2013, 15:55 | #3 | |
Пользователь
Регистрация: 11.12.2012
Сообщений: 29
|
Цитата:
Пусть есть две переменных: const MyClass* a1; MyClass*a2; так вот, для функции типа int f1(pMyStruct a) выражение f1(a2) - допустимо, а если in f2(const pMyStruct a) - выражение f2(a1) - нет, при этом, f2(a1->operator constMyStruct()) - валидно.... |
|
04.07.2013, 17:06 | #4 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 29
|
Да, подумал, и решил, что вообще-то правильнее будет:
f2(*a1) - и это сработало. Но ведь f1(a2) - допустимо! Так как правильно?! |
04.07.2013, 20:42 | #5 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Кто нибудь что нибудь понял?
|
05.07.2013, 11:22 | #6 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 29
|
Ладно, попробую более внятно, есть структура и класс:
typedef struct tagMyStruc { /// blabla }MyStruct, *pMyStruct; class MyClass: public OtherClass, public MyStruct { ..... в классе есть операторы приведения приведения к MyStruct, я их делаю следующим образом: operator pMyStruct(); operator const pMyStruct() const; далее есть два варианта ссылок на класс: MyClass* p1; const MyClass* p2; есть две функции: void f1(MyClass* p); void f2(const MyClass* p); так вот, теперь вопрос, в VS2008 вызов f1(p1); - компилируется, а вызов f2(p2); - нет; в то время, как оба вызова f1(*p1); и f2(*p2); компилируются. Вопрос, первый вариант вызова, т.е. без разыменования пойнтеров, согласуется с правилами C++ или нет? Последний раз редактировалось xe3; 05.07.2013 в 12:45. |
05.07.2013, 12:15 | #7 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
При передаче p2 (кстати, где он у вас объявлен?), в качестве параметра, в функцию... передача не пройдет. Почему? Есть предположение, что значение этого pointer - const MyClass* p попросту, из-за константности, не примет значение передаваемого pointer.
Все дело в константности, как мне кажется. Могу, кончено, и ошибаться. Просто предположение. |
05.07.2013, 12:46 | #8 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 29
|
|
05.07.2013, 12:50 | #9 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
дело в том, что const MyClass* p говорит о том, что ТО, на что указывает данный указатель является константным. Т.е константно MyClass*, то что содержит p...
А значит изменить то, что содержиться в p мы не можем. |
05.07.2013, 14:25 | #10 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
я до сих пор не понимаю этой мешанины кода
Цитата:
далее, до сих пор не получен ответ, зачем объявлять свой оператор приведения к указателю(!) на родительский класс? далее: Код:
1)код должен изначально работать отлично, либо вы выложили сюда один прототип функций, а в коде у вас иной. код(представленный) может сфейлится во время работы, если не инициализирован указатель. 2)при указателе на объект, операторы приведения типа вызываться не будут 3)даже если бы вызывался, в вашем же коде он был бы не нужен, тип итак MyClass*. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
преобразование типов | mego4el | Помощь студентам | 3 | 30.11.2011 04:50 |
преобразование типов яз СИ | Танчик007 | Помощь студентам | 0 | 03.05.2011 18:57 |
Преобразование типов | Svetlana750231 | Visual C++ | 3 | 22.04.2011 13:43 |
Преобразование типов | FaTaL | Общие вопросы .NET | 5 | 07.03.2011 14:07 |
Преобразование типов | DeFace | Общие вопросы C/C++ | 4 | 24.03.2009 17:06 |