С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

operator = - C++

18.10.2008, 22:52. Просмотров 1481. Ответов 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 &)'
при этом функция так и не вызывается.

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

Class & operator's |Error: undefined reference to operator - C++
Компилирует нормально, но когда хочу использовать оператор выдает ошибку:undefined reference to 'operator..(Fraction const&amp;, Fraction...

Вызов operator[] через operator[] const - C++
Перелистывал Майерса, наткнулся на код, подскажите пожалуйста почему он советует закомментированный вариант кода, не проще сделать как...

operator char() или operator int() - C++
Здорова госпдо! Снова ничо не ясно как всегда. Разбираю программку из книги Страуструпа, там он описывает класс String в нем есть ...

Реализация operator + через operator += - C++
внутри следующей темы возник вопрос, ответ на который так и не был получен: ...

Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" - C++
Здравствуйте. Предлагаю заняться арифметикой. Создал прослейший класс, перегрузил операторы сложения и умножения, в конструкторе...

Operator +, operator += — какой через какой реализовывать? - C++
Для class Fraction { // ... public: Fraction operator + ( const Fraction&amp; right ) const; Fraction&amp; operator += ( const...

19
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
18.10.2008, 23:35 #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
на основе его попробуй поправить свой код.
0
Жестянка
сцуко киборг
103 / 30 / 2
Регистрация: 11.09.2008
Сообщений: 193
19.10.2008, 00:29  [ТС] #3
Спасибо. Видимо, дело в том, что оператор ожидает именно ссылку, а не сам объект. Но объявлять:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Код,который выполняется внутри деструктора,пишется руками.
1
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
20.10.2008, 13:36 #13
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Деструкторы ничего не делают.Они вызываются в трех случаях.
1. когда управление программой выходит за область видимости,где объявлен класс(возврат из функции,скажем)
2. при завершении работы программы
3. при вызове оператора delete при удалении класса,созданного с помощью new
1. ?! созданный объект никуда не пропадет. Это же не статика. Она так и останется в памяти после выполнения функции.
2. Это на совести компилятора. Не стоит ему доверять.
3. Вот это правда. Только при удалении объекта, а не класса.
0
XuTPbIu_MuHTAu
Эксперт С++
2228 / 743 / 10
Регистрация: 27.05.2008
Сообщений: 1,498
20.10.2008, 13:39 #14
ойойо,везде заменить класс на объект)
нет же,если объявить объект в функции,при выходе из нее вызовется деструктор. вот о чем я все это)
0
Жестянка
сцуко киборг
103 / 30 / 2
Регистрация: 11.09.2008
Сообщений: 193
20.10.2008, 13:41  [ТС] #15
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Деструкторы ничего не делают.Они вызываются в трех случаях.
1. когда управление программой выходит за область видимости,где объявлен класс(возврат из функции,скажем)
2. при завершении работы программы
3. при вызове оператора delete при удалении класса,созданного с помощью new

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

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

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

Так?
0
20.10.2008, 13:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2008, 13:41
Привет! Вот еще темы с ответами:

Чем "operator *=" отличается от "operator *"? - C++
снова застряла, не могу понять, чем этот оператор должен отличаться от оператора*.....? вот он, но это работает только в случае...

Expected init-declarator before "operator".expected `,' or `;' before "operator" - C++
Пример не мой. Пытаюсь у себя запустить и чтото неполучается. Ошибка на строке 24 Expected init-declarator before &quot;operator&quot;.Expected...

Operator*=(); - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace::std; class Distance //Класс английских длин { ...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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