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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2013, 16:17   #11
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
По умолчанию

Извиняюсь, жара... Опять напутал... Я имел ввиду что функции определениы так:
Код:
void f1(MyStruct* p)
{
}

void f2(const MyStruct* p)
{
}
Но не суть, я въехал наконец в то, что я действительно не понимал. Напутал я изрядно, так что спасибо за помощь! Но вопросы остались, я их переформулирую, когда пойму, в чем проблема. Так бывает, легкое непонимание накручивается в клубок проблем, которые запихиваешь под коврик до поры, а потом они обрушиваются со всей неумолимой мощью... ))) Вот всяком случае этот рафинированный код:

Код:
typedef struct tagMyStruc
{
/// blabla
}MyStruct, *pMyStruct;

class MyClass: public MyStruct
{
public:
    operator pMyStruct();
    operator const pMyStruct() const;
};


MyClass* p1=NULL;
const MyClass* p2=NULL;

void f1(MyStruct* p)
{
}

void f2(const MyStruct* p)
{
}

void test()
{
    // работают операторы приведения по умолчанию
    f1(p1); 
    f2(p2); 
    // работают мои операторы
    f1(*p1); 
    f2(*p2); 
}
компилируется. А чем отличается мой, не рафинированный - вот тут надо разобраться...

Еще раз спасибо, но может вернусь уже с более усложненным вариантом. )))
xe3 вне форума Ответить с цитированием
Старый 05.07.2013, 18:09   #12
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
По умолчанию

О! Вот теперь, надеюсь, все рафинировано:

Код:
typedef struct tagMyStruc
{
/// blabla
}MyStruct, *pMyStruct;

class MyClass: public MyStruct
{
};


MyClass* p1=NULL;
const MyClass* p2=NULL;

void f1(pMyStruct p)
{
}

void f2(const pMyStruct p)
{
}

void test()
{
    f1(p1); // OK
    f2(p2); //error C2664: 'f2' : cannot convert parameter 1 from 'const MyClass *' to 'const pMyStruct'
}
вот она, моя проблема!
xe3 вне форума Ответить с цитированием
Старый 05.07.2013, 18:15   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
// работают операторы приведения по умолчанию
никаких операторов не будет вызвано.
дочерний класс итак считается полностью совместимым с родительским, потому если вы в своем операторе приведения создаете новый объект, то будет утечка памяти.

в вашем случае:
Код:
MyClass b;
MyStruct* t=&b;
вполне будет работать итак.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.07.2013, 18:35   #14
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
По умолчанию

А вот если функцию f2 переписать так:

Код:
void f2(const MyStruct* p)
{
}
то все компилируется. Баг М$?
xe3 вне форума Ответить с цитированием
Старый 05.07.2013, 18:43   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

типизация псевдонимов указателей не распространяется на предков.

вообще, я бы отходил от С-шного стиля(точнее даже АПИшного), когда на один тип по тысяче псевдонимов.
и не ленился писать *.

Цитата:
Баг М$?
нет.
не смешивайте ООП с псевдонимами на указатели типов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 05.07.2013 в 18:47.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.07.2013, 18:52   #16
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
типизация псевдонимов указателей не распространяется на предков.
А почему с f1 прокатило?!
xe3 вне форума Ответить с цитированием
Старый 05.07.2013, 18:57   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в первом случае полное соответствие псевдониму идет.
полагаю лишь это.

мой совет я вам дал, следовать ему, или идти на пути С в плюсах, решать вам.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.07.2013, 19:00   #18
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
По умолчанию

И что-же получается удобнее так:

Код:
typedef struct tagMyStruc
{
/// blabla
}MyStruct;

#define pMyStruct MyStruct*
чем так

Код:
typedef struct tagMyStruc
{
/// blabla
}MyStruct, *pMyStruct;
?!
xe3 вне форума Ответить с цитированием
Старый 05.07.2013, 19:01   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

лучше не ленится писать * в объявлении функций.

Код:
void f1(MyStruct *p)
{
}

void f2(const MyStruct *p)
{
}
то есть так
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.07.2013, 19:02   #20
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
По умолчанию

Да, и огромное спасибо!!!
xe3 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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