Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2013, 13:31   #1
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 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)?!

Спасибо!
xe3 вне форума Ответить с цитированием
Старый 04.07.2013, 14:08   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

оператор приведения к указателю на родительский класс?
что за изврат? приведение к родителю итак доступно по умолчанию.

в вашем же случае надо смотреть и код в котором применяли.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.07.2013, 15:55   #3
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 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()) - валидно....
xe3 вне форума Ответить с цитированием
Старый 04.07.2013, 17:06   #4
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
По умолчанию

Да, подумал, и решил, что вообще-то правильнее будет:

f2(*a1) - и это сработало. Но ведь
f1(a2) - допустимо!

Так как правильно?!
xe3 вне форума Ответить с цитированием
Старый 04.07.2013, 20:42   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Кто нибудь что нибудь понял?
_Bers вне форума Ответить с цитированием
Старый 05.07.2013, 11:22   #6
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 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.
xe3 вне форума Ответить с цитированием
Старый 05.07.2013, 12:15   #7
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

При передаче p2 (кстати, где он у вас объявлен?), в качестве параметра, в функцию... передача не пройдет. Почему? Есть предположение, что значение этого pointer - const MyClass* p попросту, из-за константности, не примет значение передаваемого pointer.
Все дело в константности, как мне кажется. Могу, кончено, и ошибаться. Просто предположение.
Igor95 вне форума Ответить с цитированием
Старый 05.07.2013, 12:46   #8
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
При передаче p2 (кстати, где он у вас объявлен?)
Поправил. Спасибо. Что касается константности, то чем она может помешать? Я не понял.
xe3 вне форума Ответить с цитированием
Старый 05.07.2013, 12:50   #9
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

дело в том, что const MyClass* p говорит о том, что ТО, на что указывает данный указатель является константным. Т.е константно MyClass*, то что содержит p...
А значит изменить то, что содержиться в p мы не можем.
Igor95 вне форума Ответить с цитированием
Старый 05.07.2013, 14:25   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я до сих пор не понимаю этой мешанины кода
Цитата:
в классе есть операторы приведения приведения к MyStruct
не к MyStruct а к pMyStruct, что разные типы.
далее, до сих пор не получен ответ, зачем объявлять свой оператор приведения к указателю(!) на родительский класс?

далее:
Код:
далее есть два варианта ссылок на класс:

 MyClass* p1;
 const MyClass* p2;

 есть две функции:

 void f1(MyClass* p);
 void f2(const MyClass* p);
что-то вы не договариваете:
1)код должен изначально работать отлично, либо вы выложили сюда один прототип функций, а в коде у вас иной.
код(представленный) может сфейлится во время работы, если не инициализирован указатель.
2)при указателе на объект, операторы приведения типа вызываться не будут
3)даже если бы вызывался, в вашем же коде он был бы не нужен, тип итак MyClass*.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
преобразование типов 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