TString Str1("aaa");
TString Str2("bbb");
Str1=Str2+Str1; // В этом месте выдается ошибка и прога не компилится, причем под виндой (TurboC++) все шло нормально.
сильно не разбирался, не тестил, просто прочитал...24.06.06 12:21 Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 24.06.06 12:23 Количество правок: 2
Во объявлениях всех методов принимающих char * и где не происходит его изменения (мельком глянув код я так понял что во всех) напиши вместо char * - const char *. Тк GCC ложит строки как константные данные потом у тебя неявно пытается вызываться конструктор TSTring'а для оператора + ну и не получается тк конструктор у тя принимает не const char * а char *
PS а чем std::basic_string<char> ака std::string плох?
Опять, к сожалению, немного не то...22.06.06 21:26 Автор: panter_dsd Статус: Незарегистрированный пользователь
Во первых спасибо, но ошибка не в этом. Ошибку выдает именно operator+. Можно даже тело этой функции сделать пустым, все равно ошибка.
А на счет использования "std::basic_string<char> ака std::string " - недавно только перешел на ООП. Хочу пообучаться, а это самый простой и интересный класс (мне так кажется). Я еще хочу TStringList написать, только пока не получается.
Пантер.
Гм повнимательнее посмотрел на код. Дейтствительно не то -...22.06.06 21:36 Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 22.06.06 21:37 Количество правок: 1
Гм повнимательнее посмотрел на код. Дейтствительно не то - там не char * прибавляется)
Но в любом случае с константностью у тебя там путаница а тот код что ты привел вообще не работает. А после правки - работает). Не помешал бы оригинал кода без всяких операторов + с двумя параметрами.
Временные переменные могут копироваться только в константные ссылки. Либо принимай по значению, либо не используй временных переменных, либо поопределяй все ссылки, которые ты не собираешься менять константными.
Вот код, который компилируется. Но я заметил там несколько ошибок
#include <string.h>
#include <stdio.h>
class TString
{
private:
char *string;
int StrLength;
void AddStr(char *aStr);
public:
TString();
TString(char *aStr);
TString(const TString &aString);
~TString();
void Clear();
void Delete(int First, int Count);
void LowerCase();
char *c_str() {return string;};
int Length() {return StrLength;};
operator+ вызывается в общем случае именно как функция, а не как метод класса, так что указатель класса нужно убрать. Ну и никакого this тогда быть не может.
Если, скажем, Concat - это метод для конкатенации, то код должен быть таким:
> У тебя в коде написано: > > Str1=Str2+Str1; > > Эта запись эквивалентна:
Эта в данном случае запись эквивалентна
Str1.operator=(Str2.operator+(Str1));
> Str1=operator+(Str2,Str1);
Бирарные операторы с двумя аргументами тоже бывают, но поиск в функциях-членах идет ДО поиска в глобальных функциях.
> Стало быть и в определении operator+ должно быть два > аргумента: > > TString TString::operator+(const TString &aString, > const TString &bString)
ГОНИШЬ!!!
Функция член с двумя аргументами. Не бывает такого.
Просто опечатался (вернее, Ctrl+C->Ctrl+V и не все...22.06.06 22:05 Автор: Heller <Heller> Статус: Elderman Отредактировано 22.06.06 22:05 Количество правок: 1
> > У тебя в коде написано: > > > > Str1=Str2+Str1; > > > > Эта запись эквивалентна: > > Эта в данном случае запись эквивалентна > Str1.operator=(Str2.operator+(Str1)); > > > Str1=operator+(Str2,Str1); > > Бирарные операторы с двумя аргументами тоже бывают, но > поиск в функциях-членах идет ДО поиска в глобальных > функциях. > > > Стало быть и в определении operator+ должно быть два > > аргумента: > > > > TString TString::operator+(const TString &aString, > > const TString &bString) > > ГОНИШЬ!!! > Функция член с двумя аргументами. Не бывает такого. Просто опечатался (вернее, Ctrl+C->Ctrl+V и не все подправил).
Однако согласись, что скорее не "Бирарные операторы с двумя аргументами тоже бывают", а вообще чаще операторы перегружаются за пределами класса, если этот оператор не модифицирует сам объект для которого вызывается (как, например, в случае присваивания).
И вообще я на C++ не программирую :-X
Общая рекомендация такая:23.06.06 16:29 Автор: amirul <Serge> Статус: The Elderman
Глобальный оператор делается только в том случае, если невозможно сделать его членом. То бишь, если левый аргумент либо встроенного либо библиотечного типа.
> Однако согласись, что скорее не "Бирарные операторы с двумя > аргументами тоже бывают", а вообще чаще операторы > перегружаются за пределами класса, если этот оператор не
Ни фига. Засирать глобальное пространство имен надо как можно меньше.
> модифицирует сам объект для которого вызывается (как, > например, в случае присваивания).
Если оператор не модифицирует объект, его можно объявить константым, но я все равно не понимаю, какое отношение это имеет к глобальности-членству.
> И вообще я на C++ не программирую :-X
А я программирую :-)
[C++] Не получается22.06.06 21:01 Автор: panter_dsd Статус: Незарегистрированный пользователь