Здравствуйте. I need help.
Перегрузил операции присваивания и умножения для класса многочленов. Но при отладке выяснилось, что при выходе из каждой операции происходит вызов деструктора. Возможно, точнее наиболее вероятно, что-то написал не так. Отсюда просьба: Не мог бы кто-нибудь дать кусок кода, с перегрузкой операций.
Заранее спасибо.
Здравствуйте Гарин Георгий, Вы писали:
ГГ> Здравствуйте. I need help. ГГ> Перегрузил операции присваивания и умножения для класса многочленов. Но при отладке выяснилось, что при выходе из каждой операции происходит вызов деструктора. Возможно, точнее наиболее вероятно, что-то написал не так. Отсюда просьба: Не мог бы кто-нибудь дать кусок кода, с перегрузкой операций. ГГ> Заранее спасибо.
Наверное проще тебе привести свой код, т.к не понятно у кого происходит вызов деструктора.
С уважением, OlegO.
Re: Перегрузка операций
От:
Аноним
Дата:
23.01.02 09:06
Оценка:
Здравствуйте Гарин Георгий, Вы писали:
ГГ> Здравствуйте. I need help. ГГ> Перегрузил операции присваивания и умножения для класса многочленов. Но при отладке выяснилось, что при выходе из каждой операции происходит вызов деструктора. Возможно, точнее наиболее вероятно, что-то написал не так. Отсюда просьба: Не мог бы кто-нибудь дать кусок кода, с перегрузкой операций. ГГ> Заранее спасибо.
Скорее всего вы используете конструкцию типа C = A * B и соответственно результат A * B помещается сначала в некую временную переменную, которая затем присваивается в C, и после присваивания для нее (врем. пер.) вызывается деструктор.
Т.е. фактически получается:
MyClass *TMP = new MyClass(operator*(A, B)); // или A.operator*(B) (это не важно)
C.operator=(*TMP);
delete TMP;
Так делается потому, что после умножения, но до операции присваивания результат где-то хранить надо, а переменные A и B портить нельзя ну и ...
Если хочеться соптимизировать процесс и избавиться от создания/разрушения лишнего экземляра класса, лучше наверно перегрузить оператор *= :
Здравствуйте Аноним, Вы писали:
А>Здравствуйте Гарин Георгий, Вы писали:
ГГ>> Здравствуйте. I need help. ГГ>> Перегрузил операции присваивания и умножения для класса многочленов.
А>Скорее всего вы используете конструкцию типа C = A * B и соответственно результат A * B помещается сначала в некую временную переменную, которая затем присваивается в C, и после присваивания для нее (врем. пер.) вызывается деструктор. А>Т.е. фактически получается:
А>MyClass *TMP = new MyClass(operator*(A, B)); // или A.operator*(B) (это не важно) А>C.operator=(*TMP); А>delete TMP;
Да, видимо так оно и происходит. Но вызывается несколько деструкторов для А,В,что-то еще (наверное эта временная переменная) и С. Вот поэтому-то я и просил кусок кода, чтобы посмотреть как это делается by example.
ps: А это не может происходить из-за передачи параметров. Т.е. в справочнике написано, что надо передавать параметры по ссылке, может я в этом напутал...
Здравствуйте OlegO, Вы писали:
ГГ>> Здравствуйте. I need help. ГГ>> Перегрузил операции присваивания и умножения для класса многочленов. Но при отладке
OO>Наверное проще тебе привести свой код, т.к не понятно у кого происходит вызов деструктора.
код привести нет возможности (сейчас), т.к. нахожусь на работе, а прога пишется дома.
Здравствуйте Гарин Георгий, Вы писали:
ГГ>Здравствуйте Аноним, Вы писали:
А>>Здравствуйте Гарин Георгий, Вы писали:
ГГ>>> Здравствуйте. I need help. ГГ>>> Перегрузил операции присваивания и умножения для класса многочленов.
А>>Скорее всего вы используете конструкцию типа C = A * B и соответственно результат A * B помещается сначала в некую временную переменную, которая затем присваивается в C, и после присваивания для нее (врем. пер.) вызывается деструктор. А>>Т.е. фактически получается:
А>>MyClass *TMP = new MyClass(operator*(A, B)); // или A.operator*(B) (это не важно) А>>C.operator=(*TMP); А>>delete TMP; ГГ> Да, видимо так оно и происходит. Но вызывается несколько деструкторов для А,В,что-то еще (наверное эта временная переменная) и С. Вот поэтому-то я и просил кусок кода, чтобы посмотреть как это делается by example. ГГ> ps: А это не может происходить из-за передачи параметров. Т.е. в справочнике написано, что надо передавать параметры по ссылке, может я в этом напутал...
ГГ>Все равно спасибо
T>const String String::operator+(const String& s1)
T>{
T> String temp;
T> delete [] temp.data;
T> temp.data = new char[strlen(data)+strlen(s1.data)+1];
Указатели на буферы, которые возвращают basic_string::data() и basic_string::c_str() являются константными. Также, удалять эти буферы нельзя - этим занимается basic_string.
T> strcpy(temp.data, data);
T> strcat(temp.data, s1.data);
T> return temp;
T>}
T>
ME>Указатели на буферы, которые возвращают basic_string::data() и basic_string::c_str() являются константными. Также, удалять эти буферы нельзя — этим занимается basic_string.
Ошибся: не константные указатели, а указатели на константу.
Здравствуйте MaximE, Вы писали:
ME>>Указатели на буферы, которые возвращают basic_string::data() и basic_string::c_str() являются константными. Также, удалять эти буферы нельзя — этим занимается basic_string.
ME>Ошибся: не константные указатели, а указатели на константу.
ЭЭЭЭ.... Это вообще то не класс string из STL, а класс String релизованный мной, ну то есть я просто учился...
А по поводу возвращения по ссылке в принципе можно, но очень не рекомендовано (Скот Майерс)
В жизни мало быть умным, надо еще быть не дураком.