operator+
От: piAnd Россия  
Дата: 23.04.03 22:21
Оценка:
Народ! Подскажите новичку как выйти из ситуации:

operator+ объявлен вне класса, объекты которого он суммирует
Сам класс имеет динамический массив, на конструкторе создается,в деструкторе — уничтожается, но вот проблема:
Получается ошибка Access volation на этом операторе...
class ANYCLASS
{
....
char *Str; //этот указатель и указывает на дин. массив
};

ANYCLASS &operator +(ANYCLASS &p1, ANYCLASS &p2)
{
ANYCLASS Temp; //создался объект и в нем выделилась память
...
return Temp;
}
//а если перед оператором неставить &, то вылетает еще быстрее

Что в таких случаях делать?
Спасибо
Re: operator+
От: PM  
Дата: 24.04.03 05:12
Оценка: +1
Здравствуйте, piAnd, Вы писали:

A>Народ! Подскажите новичку как выйти из ситуации:


A>operator+ объявлен вне класса, объекты которого он суммирует

A>Сам класс имеет динамический массив, на конструкторе создается,в деструкторе — уничтожается, но вот проблема:
A>Получается ошибка Access volation на этом операторе...
A>
A>class ANYCLASS
A>{
A>....
A>char *Str; //этот указатель и указывает на дин. массив
A>};

A>ANYCLASS &operator +(ANYCLASS &p1, ANYCLASS &p2)
A>{
A>ANYCLASS Temp; //создался объект и в нем выделилась память
A>...
A>return Temp;
A>}
A>//а если перед оператором неставить &, то вылетает еще быстрее
A>

A>Что в таких случаях делать?

1) Возвращать не ссылку на временный объект, который к моменту выхода из функции уничтожается, а копию результата.
2) Предусмотреть правильный конструктор копирования (и оператор присваивания), в котором копируется динамический массив.
... << RSDN@Home 1.0 beta 6a >>
Re: operator+
От: Bell Россия  
Дата: 24.04.03 06:17
Оценка:
Здравствуйте, piAnd, Вы писали:


const ANYCLASS operator +(ANYCLASS &p1, ANYCLASS &p2)
{
ANYCLASS Temp; //создался объект и в нем выделилась память
...
return Temp;
}


кроме того, необходимо определить конструктор корпирования для ANYCLASS.
А еще лучше всместо члена char *Str использовать std::string или std::vector<char>
Любите книгу — источник знаний (с) М.Горький
Re[2]: operator+
От: piAnd Россия  
Дата: 24.04.03 17:26
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, piAnd, Вы писали:



B>
B>const ANYCLASS operator +(ANYCLASS &p1, ANYCLASS &p2)
B>{
B>ANYCLASS Temp; //создался объект и в нем выделилась память
B>...
B>return Temp;
B>}
B>


B>кроме того, необходимо определить конструктор корпирования для ANYCLASS.

B>А еще лучше всместо члена char *Str использовать std::string или std::vector<char>
Глупая Ошибка выявилась в конструкторе копирования
При const ANYCLASS вылезает error:
e:\temp\programmer\ex\win\spl.h(308) : error C2678: binary '+' : no operator defined which takes a left-hand operand of type 'const class win_spl' (or there is no acceptable conversion)
Error executing cl.exe.
Есть ли какая-нибудь принципиальная разница, с const оператор или без?
Re[3]: operator+
От: Кодт Россия  
Дата: 24.04.03 17:31
Оценка:
Здравствуйте, piAnd, Вы писали:

A>Есть ли какая-нибудь принципиальная разница, с const оператор или без?


А как, по-твоему, должен вызваться деструктор возвращенного значения?
... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
Re[4]: operator+
От: piAnd Россия  
Дата: 24.04.03 17:54
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А как, по-твоему, должен вызваться деструктор возвращенного значения?

К>
В error'е про деструктор ниче несказано, если объявить так
const ANYCLASS operator +(const ANYCLASS &p1,const ANYCLASS &p2)

VC недает вызывать никакие методы класса... даже тривиальные
int GetValue (void)
{
return i; // error C2662: 'GetValue' : cannot convert 'this' pointer from 'const class win_spl' to 'class win_spl &'
}

const что непозволяет делать никаких действий с классом?
Re[5]: operator+
От: Кодт Россия  
Дата: 24.04.03 17:58
Оценка:
Здравствуйте, piAnd, Вы писали:

A>VC недает вызывать никакие методы класса... даже тривиальные

A>
A>int GetValue (void)
A>{
A>return i; // error C2662: 'GetValue' : cannot convert 'this' pointer from 'const class win_spl' to 'class win_spl &'
A>}
A>

A>const что непозволяет делать никаких действий с классом?

Не позволяет модифицировать объект.
А функция int GetValue(void) const Ы?
... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
Re[6]: operator+
От: piAnd Россия  
Дата: 24.04.03 18:16
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Не позволяет модифицировать объект.

К>А функция int GetValue(void) const Ы?
конечно нет, пора срочно на перекур
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.