Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
сцуко киборг
103 / 30 / 4
Регистрация: 11.09.2008
Сообщений: 193
1

operator =

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

Author24 — интернет-сервис помощи студентам
Посмотрите, пожалуйста, ато я саафсем запарилась... %)

Проблема такая: есть класс, у которого есть функция присваивания:
Код
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2008, 22:52
Ответы с готовыми решениями:

Перегрузка операторов operator> и operator* для чисел в разных системах счисления
Мне нужно Перегрузить операции&gt; (сравнение двух целых чисел с учетом системы счисления), *...

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

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

Перегрузка operator>> и operator<< в абстрактном классе
Здрасьте! Есть необходимость перегрузить потоки, Я знаю как это сделать через friend, но вот...

19
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
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 / 4
Регистрация: 11.09.2008
Сообщений: 193
19.10.2008, 00:29  [ТС] 3
Спасибо. Видимо, дело в том, что оператор ожидает именно ссылку, а не сам объект. Но объявлять:

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

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

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

может быть стоит как-то перегрузить функции чтобы они принемали указатели?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
19.10.2008, 01:08 4
Ха. А что же еще должно вернуться, если объект не создан? Чушь и возвращается.
Не вижу проблемы с использованием указателей.
0
сцуко киборг
103 / 30 / 4
Регистрация: 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
296 / 56 / 5
Регистрация: 22.05.2008
Сообщений: 788
19.10.2008, 12:12 6
Вызывай деструкторы когда программа уже НИЧЕГО не делает. Тоесть как раз onexit.
0
сцуко киборг
103 / 30 / 4
Регистрация: 11.09.2008
Сообщений: 193
19.10.2008, 14:53  [ТС] 7
Цитата Сообщение от Spo1ler Посмотреть сообщение
Вызывай деструкторы когда программа уже НИЧЕГО не делает. Тоесть как раз onexit.
Тоже вариант. Спасибо, Spo1ler!

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

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

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

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

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

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

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


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

Код,который выполняется внутри деструктора,пишется руками.
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
20.10.2008, 13:36 13
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Деструкторы ничего не делают.Они вызываются в трех случаях.
1. когда управление программой выходит за область видимости,где объявлен класс(возврат из функции,скажем)
2. при завершении работы программы
3. при вызове оператора delete при удалении класса,созданного с помощью new
1. ?! созданный объект никуда не пропадет. Это же не статика. Она так и останется в памяти после выполнения функции.
2. Это на совести компилятора. Не стоит ему доверять.
3. Вот это правда. Только при удалении объекта, а не класса.
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
20.10.2008, 13:39 14
ойойо,везде заменить класс на объект)
нет же,если объявить объект в функции,при выходе из нее вызовется деструктор. вот о чем я все это)
0
сцуко киборг
103 / 30 / 4
Регистрация: 11.09.2008
Сообщений: 193
20.10.2008, 13:41  [ТС] 15
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Деструкторы ничего не делают.Они вызываются в трех случаях.
1. когда управление программой выходит за область видимости,где объявлен класс(возврат из функции,скажем)
2. при завершении работы программы
3. при вызове оператора delete при удалении класса,созданного с помощью new

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

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

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

Так?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
20.10.2008, 13:46 16
Цитата Сообщение от Жестянка Посмотреть сообщение
а чево он делает тогда?
Деструктор не удаляет объект, я еще раз говорю. Дестркутор это просто функция. Просто функция, которая вызывается перед удалением объекта. Служит она для того, чтобы ты почистила за собой внутренние структуры объекта. Сам деструктор не удалит объект!.

Вот сама подумай-ка. Что если я сделаю пустой деструктор. Судя по тому, что ты написала, такой объект не удалится, так деструктор ничего не делает. Но это бред полный. Я вызову:
Код
delete obj;
перед тем, как очистить память из под объекта вызовется пустой деструктор, а потом объекта не станет.
Так же как и конструктор не создает сам объект. В нем ты просто выделяешь память под свои внутренние струтуры. Оператор new же не знает о них.

Добавлено через 2 минуты 21 секунду
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
ойойо,везде заменить класс на объект)
нет же,если объявить объект в функции,при выходе из нее вызовется деструктор. вот о чем я все это)
Объект да. Но если объявить указатель на объект и выделить память, например, new он не должен его удалить. По крайней мере, у меня никогда не удалял. Да и с чего бы. Это же указатель. Я спокойно могу создать указатель на объект, создать объект, вернуть указатель и работать с объектом вне функции. А в конце работы проги вызвать delete.

Добавлено через 1 минуту 4 секунды
Цитата Сообщение от Жестянка Посмотреть сообщение
Запутали, блин, юзера! Ещё гуру называюцца.

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

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

Так?
Так. Только деструктор тут не при чем. А вызывать деструктор напрямую это убожество просто не делай никогда так

P. S. если ты покажешь место, где мы назвались "гуру" я буду благодарен.
1
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
20.10.2008, 13:49 17
Vourhey,я не просто так выделил случай с new отдельно. Объекты созданные new удаляются с помощью delete,остальные живут только в своей области видимости.
Жестянка, Советую обратить внимание на свой код,а не на нашу...эмм...гурушность. И,надеюсь,вы задали конструктор копирования...в противном случае вашу программу ждет крах.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
20.10.2008, 13:54 18
Код
#include <iostream>

using namespace std;

class one
{
public:
	one()
	{
		cout<<"in constructor";
		s = (char*)malloc(3);
		strcpy(s, "hi");
	}
	~one()
	{
		cout<<"In destructor";
		free(s);
	}
	char* s;
	void hi()
	{
		cout<<s<<endl;
	}
};

one *func()
{
	one *n = new one();
	return n;
}

void main()
{
	one *n2 = func();
//вышли из функции
	n2->hi();
	delete n2;//деструктор вызовется только здесь.
	cin.get();
}
Вывод:
in constructor
hi
In destructor
Или я никак не пойму, о чем ты
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
20.10.2008, 13:56 19
Код
#include <stdio.h>
#include <conio.h>
class MyClass {
    int * n;
public:
    MyClass() { 
        n = new int[10];
    };
    ~MyClass() {
         printf("destructor called ");
        delete [] n;
    };
};
void f(MyClass c ) {

    printf("f called ");
};

int main() {

    MyClass c;
    f(c);
    return 0;
};
Программа заодно и с распространенной ошибкой.
0
сцуко киборг
103 / 30 / 4
Регистрация: 11.09.2008
Сообщений: 193
20.10.2008, 14:04  [ТС] 20
Vourhey, всё понятно.
Тоесть, надо писать delete []m; внутри деструктора, для собственных переменных. Если объект создается через new надо удалять его delet'ом. В остальных случаях всё и так удалится.

cyberguru.ru

Добавлено через 5 минут 48 секунд
XuTPbIu_MuHTAu,
...в противном случае вашу программу ждет крах
Моя программа уже прекрастно работает. Конечно, благодаря вам.
0
20.10.2008, 14:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2008, 14:04
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru