Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Жестянка
сцуко киборг
102 / 29 / 2
Регистрация: 11.09.2008
Сообщений: 193
#1

operator = - C++

18.10.2008, 22:52. Просмотров 1443. Ответов 19
Метки нет (Все метки)

Посмотрите, пожалуйста, ато я саафсем запарилась... %)

Проблема такая: есть класс, у которого есть функция присваивания:
Код
class Setuation 
{
public:
Setuation(int Rec=0) // конструктор
        {
        Receptors=Rec;
        m=new int [Receptors];
        for(int i=0;i<Receptors;i++)
                {
                m[i]=0;
                }
        }

...

Setuation & operator=(Setuation &Sn) // функция присваивания
{
if(this != &Sn)
        {
        delete [] m;
        Receptors=Sn.ItsLong();
        m=new int [Receptors];
        for(int i=0;i<Receptors;i++)
                {
                m[i]=Sn(i);
                }
        }
return *this;
}
private:
int Receptors;
int *m;
};
В основной ещё есть функция, возвращающая объект этого класса:

Код
Setuation  InpFromBoard()
{
Setuation S(9);

...

return S;}
если в основной проге пытаться написать:

Код
Setuation S(9);
S=InpFromBoard();
компелер выдает:
Код
[C++ Error] IndXO.cpp(43): E2285 Could not find a match for 'Setuation::operator =(Setuation)'
если обратиться:

Код
S.operator =(InpFromBoard());
компелит с предупреждением:
Код
[C++ Warning] IndXO.cpp(58): W8030 Temporary used for parameter 'Sn' in call to 'Setuation::operator =(Setuation &)'
при этом функция так и не вызывается.

Подозреваю, что дело в сцылке, но что именно не так понять не могу...
Вопщем: %)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2008, 22:52     operator =
Посмотрите здесь:

Operator + - C++
Создайте в классе Circle оператор + для сложения объектов типа Circle. Необходимо складывать только величины радиусов itsRadius. ...

Operator= - C++
Добрый день. Имеется необходимость создать объект от родительского класса, а затем его наследнику присвоить объект другого типа. ...

operator >> - C++
// 1.h #ifndef STONEWT_H_ #define STONEWT_H_ using std::cout; using std::cin; using std::endl; class Stonewt { private: ...

operator - C++
Всем привет, опять непонятка в книге, дошел до оператора operator и ничего не понял, для чего он нужен, что он делает, то есть как он...

Operator>> - C++
Привет, всем!!! У меня следующая проблема: при использовании operator&gt;&gt; внутри цикла while, т.е while(operator &gt;&gt; variable), выполняется...

operator< - C++
bool operator&lt;(char c1,char c2) { //error C2803: 'operator &lt;' must have at least one formal parameter of class type if...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
18.10.2008, 23:35     operator = #2
Мне, что-то, немного неудобно разбираться в твоем коде. Я его чуть изменил, чтобы он работал и наглядно тебе показал, что переопределенный оператор вызывается. Вот он:
Код
#include <iostream>

using namespace std;

class Setuation 
{
public:
Setuation(int Rec=0) // конструктор
{
        Receptors=Rec;
        m=new int [Receptors];
        for(int i=0;i<Receptors;i++)
                {
                m[i]=0;
                }
        }

Setuation & operator=(Setuation &Sn)
{
	this->Receptors = Sn.Receptors;
	cout<<"In operator ="<<endl;
	return *this;
}
int Receptors;
int *m;
int ItsLong()
{
	return 5;
}
};

Setuation  &InpFromBoard()
{
	Setuation *S = new Setuation(9);
	return *S;
}

 void main()
{
	Setuation S(5);
	cout<<"Before: "<<S.Receptors<<endl;
	S=InpFromBoard();
	cout<<"After: "<<S.Receptors<<endl;
	cin.get();
}
Вывод:
Before: 5
In operator =
After: 9
на основе его попробуй поправить свой код.
Жестянка
сцуко киборг
102 / 29 / 2
Регистрация: 11.09.2008
Сообщений: 193
19.10.2008, 00:29  [ТС]     operator = #3
Спасибо. Видимо, дело в том, что оператор ожидает именно ссылку, а не сам объект. Но объявлять:

Код
Setuation *S = new Setuation(9);
не получается т.к. дальше функция вызывает встроенные операторы класса, а они указатели не воспринимают.

Если после вызова этих функций тупо объявлять указатель:

Код
Setuation *pS=&S;
return *pS;
возвращается полная чушь вместо объекта...

может быть стоит как-то перегрузить функции чтобы они принемали указатели?
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
19.10.2008, 01:08     operator = #4
Ха. А что же еще должно вернуться, если объект не создан? Чушь и возвращается.
Не вижу проблемы с использованием указателей.
Жестянка
сцуко киборг
102 / 29 / 2
Регистрация: 11.09.2008
Сообщений: 193
19.10.2008, 10:23  [ТС]     operator = #5
А что же еще должно вернуться, если объект не создан?
Ещё раз спасибо!

Хмм... Действительно... Хотя, вроде бы, я просто присваиваю указателю адрес уже существующего объекта...

а проблема с указателями в том, чо внутри функции используется ещё одна операторная функция объекта: operator (), который возвращает ссылку.

Поэтому, эсли написать:

Код
*S(i)=X
получается нечто вроде указателя на ссылку %)

Вышла из этого положения так:

Код
S[0](i)=O;
однако тут возникает ещё одна проблема:
когда создается указатель:

Код
Setuation *S=new Setuation(9);
компелер, видимо, считает, что создал только указатель, а про объект "забывает".
следовательно после окончания работы функции деструктор ~Setuation(); не вызывается... Что, по-моему, приводит к утечке памяти...

Где тогда вызывать деструктор? Если до return, нечего будет возвращать, если после - до него просто не будет доходить управоение... %)

Или всё в порядке?
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
19.10.2008, 12:12     operator = #6
Вызывай деструкторы когда программа уже НИЧЕГО не делает. Тоесть как раз onexit.
Жестянка
сцуко киборг
102 / 29 / 2
Регистрация: 11.09.2008
Сообщений: 193
19.10.2008, 14:53  [ТС]     operator = #7
Цитата Сообщение от Spo1ler Посмотреть сообщение
Вызывай деструкторы когда программа уже НИЧЕГО не делает. Тоесть как раз onexit.
Тоже вариант. Спасибо, Spo1ler!

Хотя и не совсем так, как хотелось бы... т.к. Подпрограмма может вызываться десятки раз за работу основной проги... И каждый раз после неё будет оставаться захапанным кусок оперативки размером в массив дабулов, содержащий от 4 до 40 000 эллементов, что печально.

Нет ли какова-нить другого места для корректного вызова деструктора?

Добавлено через 54 минуты 24 секунды
к тому же указатель на объект как раз благополучно удаляется при выходе из функции... Так что получается как с сусликом...

Или событие onexit есть у функций? Тогда как написать его обработку?
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.10.2008, 11:57     operator = #8
Деструктор не нужно вызывать напрямую. Удаляй свой объект через delete.
Жестянка
сцуко киборг
102 / 29 / 2
Регистрация: 11.09.2008
Сообщений: 193
20.10.2008, 12:00  [ТС]     operator = #9
Vourhey, спасиботак и буду.

delete даже не пригодился. После очередной компеляции деструктор начал вызываться сам. Балдею от билдера.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.10.2008, 12:15     operator = #10
Билдер не будет сам вызывать удаление объекта на указателях. Удаляй объект сама. Иначе огребешь по ушам с прогой.

P. S. чтобы ты была в курсе, вызов деструктора не удаляет объект.
Жестянка
сцуко киборг
102 / 29 / 2
Регистрация: 11.09.2008
Сообщений: 193
20.10.2008, 13:22  [ТС]     operator = #11
Удаляй объект сама.
так где всётаки етот объект удалять, если его надо вернуть? %)

чтобы ты была в курсе, вызов деструктора не удаляет объект.
а чево он делает тогда?
"...Если конструкторы служат для создания и инициализации объектов класса, то деструкторы удаляют из памяти отработавшие объекты и освобождают выделенную для них память..."(Д.Либерти,Д.Хорват)
XuTPbIu_MuHTAu
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
20.10.2008, 13:28     operator = #12
Цитата Сообщение от Жестянка Посмотреть сообщение
так где всётаки етот объект удалять, если его надо вернуть? %)


а чево он делает тогда?
"...Если конструкторы служат для создания и инициализации объектов класса, то деструкторы удаляют из памяти отработавшие объекты и освобождают выделенную для них память..."(Д.Либерти,Д.Хорват)
Деструкторы ничего не делают.Они вызываются в трех случаях.
1. когда управление программой выходит за область видимости,где объявлен объект(возврат из функции,скажем)
2. при завершении работы программы
3. при вызове оператора delete при удалении объекта,созданного с помощью new

Код,который выполняется внутри деструктора,пишется руками.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.10.2008, 13:36     operator = #13
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Деструкторы ничего не делают.Они вызываются в трех случаях.
1. когда управление программой выходит за область видимости,где объявлен класс(возврат из функции,скажем)
2. при завершении работы программы
3. при вызове оператора delete при удалении класса,созданного с помощью new
1. ?! созданный объект никуда не пропадет. Это же не статика. Она так и останется в памяти после выполнения функции.
2. Это на совести компилятора. Не стоит ему доверять.
3. Вот это правда. Только при удалении объекта, а не класса.
XuTPbIu_MuHTAu
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
20.10.2008, 13:39     operator = #14
ойойо,везде заменить класс на объект)
нет же,если объявить объект в функции,при выходе из нее вызовется деструктор. вот о чем я все это)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2008, 13:41     operator =
Еще ссылки по теме:

operator[] - C++
class A { public: A(){} prvate: int _m; }; Как перегрузить оператор , что бы можно было написать

operator= - C++
Такой вопрос. Есть объект. Хочу чтобы при присваивании его к чеслу выдавалось число. Например. class MyClass { short...

Operator* - C++
в этой программе мне надо умножить два числа a &amp; b ??? допустим в ob(2,5) перемножить 2 &amp; 5 #include&lt;iostream&gt; #include&lt;vector&gt; ...

operator++ - C++
Всем доброго времени суток. Вот сделал перегрузку оператора ++ TAvia TAvia::operator++() { TAvia temp; temp.year=this-&gt;year+1; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Жестянка
сцуко киборг
102 / 29 / 2
Регистрация: 11.09.2008
Сообщений: 193
20.10.2008, 13:41  [ТС]     operator = #15
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Деструкторы ничего не делают.Они вызываются в трех случаях.
1. когда управление программой выходит за область видимости,где объявлен класс(возврат из функции,скажем)
2. при завершении работы программы
3. при вызове оператора delete при удалении класса,созданного с помощью new

Код,который выполняется внутри деструктора,пишется руками.
Запутали, блин, юзера! Ещё гуру называюцца.

Естественно, я не ногами деструкторы пишу.

Но если написано: delete []m;, значит удаляет сётаки.

Так?
Yandex
Объявления
20.10.2008, 13:41     operator =
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru