Проблемы с использованием operator const char*() const
От: Кулешов Сергей Украина  
Дата: 19.12.05 13:17
Оценка:
Доброго дня, подскажите пожалуйста *более правильное* решение моей проблемы:
Есть свой класс String c перегруженным оператором const char*() const:

class String
{
    static const char* Convert(const wchar*);
public:
    operator const char*() const;
    operator string() const;
private:
    wstring str;
};

class Client
{
    int Func()
    {
        FILE* f = fopen(fileName, "a+");
        if (!f)
            return -1;      
        // ....
        fclose(f);
    }
    String fileName;
};

Так вот после
main()
{
    Client c;
    c.fileName = "somefile.txt";
    c.Func();
}

Все проходит без ликов, а вот при каждом след. вызове Func() — получаем +1 лик.
Смотрим определения операторов.
String::operator const char*() const
{
    return String::Convert(str);;
}
String::operator string() const
{
    return string(String::Convert(str));
}

Теперь, потанцуем.
int Func()
{
    FILE* f = fopen(fileName.operator string().c_str(), "a+"); // делаем явный вызов.
    if (!f)
        return -1;      
    // ....
    fclose(f);
}

Все проблема решена — ликов больше не наблюдаеться.
Преобразуем
String::operator const char*() const
{
    return operator string().c_str();
}

Опять появляются лики!!!
Преобразуем2:
String::operator const char*() const
{
    return string(String::Convert(str)).c_str();
}

Лики остаются.
Так вот, танцы с operator const char* у меня не получились, вот поэтому, собственно, и написал.
Хотелось бы помощи в написании operator const char*() const.
Спасибо!
Re: Проблемы с использованием operator const char*() const
От: Аноним  
Дата: 19.12.05 15:08
Оценка:
что такое String::Convert ? Где его определение?
Re[2]: Проблемы с использованием operator const char*() cons
От: Кулешов Сергей Украина  
Дата: 19.12.05 15:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>что такое String::Convert ? Где его определение?

Определение в самом начале:
static const char* Convert(const wchar*) // ф-я для перевода из wchar_t строки в char строку.
Re: Проблемы с использованием operator const char*() const
От: Roman Odaisky Украина  
Дата: 21.12.05 18:55
Оценка:
Здравствуйте, Кулешов Сергей, Вы писали:

КС>Доброго дня, подскажите пожалуйста *более правильное* решение моей проблемы:

КС>Есть свой класс String c перегруженным оператором const char*() const:

Умные люди не рекомендуют создавать таковой вообще. Например, http://www.gotw.ca/gotw/019.htm.

КС>Хотелось бы помощи в написании operator const char*() const.


Если все же очень хочется, то, скорее всего, следует смотреть в сторону Convert. Что за указатель она возвращает? На статический буфер? На динамически выделяемую память? Или, чего доброго, на локальный нестатический буфер?
До последнего не верил в пирамиду Лебедева.
Re: Проблемы с использованием operator const char*() const
От: Аноним  
Дата: 21.12.05 20:27
Оценка:
Здравствуйте, Кулешов Сергей, Вы писали:


КС>String::operator const char*() const

КС>{
КС> return string(String::Convert(str)).c_str();
КС>}

Оффтоп, но код, приведённый выше — фигня — он возвращает указатель на данные разрушенного обекта.
Причина же утечки скорее всего в String::Convert — что она возвращает?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.