Перегрузка операций
От: Гарин Георгий  
Дата: 23.01.02 07:57
Оценка:
Здравствуйте. I need help.
Перегрузил операции присваивания и умножения для класса многочленов. Но при отладке выяснилось, что при выходе из каждой операции происходит вызов деструктора. Возможно, точнее наиболее вероятно, что-то написал не так. Отсюда просьба: Не мог бы кто-нибудь дать кусок кода, с перегрузкой операций.
Заранее спасибо.
Re: Перегрузка операций
От: OlegO Россия http://www.mediachase.ru
Дата: 23.01.02 08:27
Оценка:
Здравствуйте Гарин Георгий, Вы писали:

ГГ> Здравствуйте. 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 портить нельзя ну и ...
Если хочеться соптимизировать процесс и избавиться от создания/разрушения лишнего экземляра класса, лучше наверно перегрузить оператор *= :

A *= B;

WBR, AND
Re[2]: Перегрузка операций
От: Гарин Георгий  
Дата: 23.01.02 09:27
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Гарин Георгий, Вы писали:


ГГ>> Здравствуйте. 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: А это не может происходить из-за передачи параметров. Т.е. в справочнике написано, что надо передавать параметры по ссылке, может я в этом напутал...

Все равно спасибо
Re[2]: Перегрузка операций
От: Гарин Георгий  
Дата: 23.01.02 09:29
Оценка:
Здравствуйте OlegO, Вы писали:

ГГ>> Здравствуйте. I need help.

ГГ>> Перегрузил операции присваивания и умножения для класса многочленов. Но при отладке


OO>Наверное проще тебе привести свой код, т.к не понятно у кого происходит вызов деструктора.


код привести нет возможности (сейчас), т.к. нахожусь на работе, а прога пишется дома.
Re[3]: Перегрузка операций
От: Trantor Россия  
Дата: 23.01.02 10:34
Оценка:
Здравствуйте Гарин Георгий, Вы писали:

ГГ>Здравствуйте Аноним, Вы писали:


А>>Здравствуйте Гарин Георгий, Вы писали:


ГГ>>> Здравствуйте. 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: А это не может происходить из-за передачи параметров. Т.е. в справочнике написано, что надо передавать параметры по ссылке, может я в этом напутал...

ГГ>Все равно спасибо


Вот пример, может не очень оптимальный...
const String String::operator+(const String& s1)
{
    String temp;
    delete [] temp.data;
    temp.data = new char[strlen(data)+strlen(s1.data)+1];
    strcpy(temp.data, data);
    strcat(temp.data, s1.data);
    return temp;
}

Только возвращать по ссылке нельзя!!!
В жизни мало быть умным, надо еще быть не дураком.
Re[4]: Перегрузка операций
От: MaximE Великобритания  
Дата: 24.01.02 07:08
Оценка:
T>Вот пример, может не очень оптимальный...
T>
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>


T>Только возвращать по ссылке нельзя!!!

Можно.
Re[5]: Перегрузка операций
От: MaximE Великобритания  
Дата: 24.01.02 07:15
Оценка:
ME>Указатели на буферы, которые возвращают basic_string::data() и basic_string::c_str() являются константными. Также, удалять эти буферы нельзя — этим занимается basic_string.

Ошибся: не константные указатели, а указатели на константу.
Re[6]: Перегрузка операций
От: Trantor Россия  
Дата: 24.01.02 07:50
Оценка:
Здравствуйте MaximE, Вы писали:

ME>>Указатели на буферы, которые возвращают basic_string::data() и basic_string::c_str() являются константными. Также, удалять эти буферы нельзя — этим занимается basic_string.


ME>Ошибся: не константные указатели, а указатели на константу.


ЭЭЭЭ.... Это вообще то не класс string из STL, а класс String релизованный мной, ну то есть я просто учился...
А по поводу возвращения по ссылке в принципе можно, но очень не рекомендовано (Скот Майерс)
В жизни мало быть умным, надо еще быть не дураком.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.