С+ передача перегруженного оператора в pfintf(). Почему так? :рукалицо:

Статус: Offline
Реєстрація: 08.04.2009
Повідом.: 18271
С+ передача перегруженного оператора в pfintf(). Почему так? :рл:

Проблему решил, но "осадочек остался"(С)
Почему ТАК? не нахожу такой случай ни в одной книжке.


есть класс (пусть MYCLASS_STR:public MYCLASS - в оригинале всё тоже кпсом).

В нём перегружен оператор
Код:
....
    operator char*() const
    {
        return (char*) aBuffer;
    }
....
char* aBuffer - объявден protected где-то там, он инициализирован, там всё нормально, данные в нём есть, память выделена.

То есть, я могу написать так
Код:
..
MYCLASS_STR BRED;

BRED="bred";
..
а потом если делать
Код:
printf ("Write some bred = %s\n", BRED);
получим необработанное исключение Нарушение прав доступа при чтении.

Не, я понимаю, что принтф - небезопасен, как минимум...
но в этом-то случае что конкретно ему не нравится?
Он пытается вывести сам код перегруженного оператора, не воспринимая, что нужен результат, а тупо пытаясь распарсить и напечатать сам оператор?

P.S. Если завести переменную а и віполнить ей
char* a=BRED
- всё выводится.
 
надо смотреть тип protected переменной aBuffer, возможно она обьявлена как std::vector<char> или std::string.
Поэтому просто С-преобразование к char* будет неправильно, так как aBuffer один тип указателя преобразовывается к другому, что не верно, соотв. будет исключение.
Что надо делать : получить буфер данных сложного типа, а потом уже указатель буфера преобразовывать к char*
Если это std::vector, то &aBuffer[0], если std::string - aBuffer.c_str()

....
operator const char*() const
{
return aBuffer.c_str();
}
....

По-хорошему , надо использовать c++ преобразование типов, static_cast, const_cast, dynamic_cast, reinterpret_cast и блок try-catch

В данному случае можно было обойтись без исключений так:

....
operator char*() const
{
return static_cast<char*>( reinterpret_cast<void*>( &aBuffer ) );
}
....

На выходе получим либо преобразование, либо nullptr который можно проверить, без исключений
 
Назад
Зверху Знизу