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

operator = - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Жестянка
сцуко киборг
 Аватар для Жестянка
102 / 29 / 2
Регистрация: 11.09.2008
Сообщений: 193
18.10.2008, 22:52     operator = #1
Посмотрите, пожалуйста, ато я саафсем запарилась... %)

Проблема такая: есть класс, у которого есть функция присваивания:
Код
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 =
Посмотрите здесь:

C++ operator++
C++ operator
operator< C++
C++ operator=
C++ operator[]
Operator>> C++
operator >> C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6470 / 2245 / 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
Почетный модератор
6470 / 2245 / 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
 Аватар для Spo1ler
291 / 51 / 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
Почетный модератор
6470 / 2245 / 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
Почетный модератор
6470 / 2245 / 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
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
20.10.2008, 13:28     operator = #12
Цитата Сообщение от Жестянка Посмотреть сообщение
так где всётаки етот объект удалять, если его надо вернуть? %)


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

Код,который выполняется внутри деструктора,пишется руками.
Vourhey
Почетный модератор
6470 / 2245 / 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
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
20.10.2008, 13:39     operator = #14
ойойо,везде заменить класс на объект)
нет же,если объявить объект в функции,при выходе из нее вызовется деструктор. вот о чем я все это)
Жестянка
сцуко киборг
 Аватар для Жестянка
102 / 29 / 2
Регистрация: 11.09.2008
Сообщений: 193
20.10.2008, 13:41  [ТС]     operator = #15
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Деструкторы ничего не делают.Они вызываются в трех случаях.
1. когда управление программой выходит за область видимости,где объявлен класс(возврат из функции,скажем)
2. при завершении работы программы
3. при вызове оператора delete при удалении класса,созданного с помощью new

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

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

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

Так?
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.10.2008, 13:46     operator = #16
Цитата Сообщение от Жестянка Посмотреть сообщение
а чево он делает тогда?
Деструктор не удаляет объект, я еще раз говорю. Дестркутор это просто функция. Просто функция, которая вызывается перед удалением объекта. Служит она для того, чтобы ты почистила за собой внутренние структуры объекта. Сам деструктор не удалит объект!.

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

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

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

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

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

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

P. S. если ты покажешь место, где мы назвались "гуру" я буду благодарен.
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
20.10.2008, 13:49     operator = #17
Vourhey,я не просто так выделил случай с new отдельно. Объекты созданные new удаляются с помощью delete,остальные живут только в своей области видимости.
Жестянка, Советую обратить внимание на свой код,а не на нашу...эмм...гурушность. И,надеюсь,вы задали конструктор копирования...в противном случае вашу программу ждет крах.
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.10.2008, 13:54     operator = #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
Или я никак не пойму, о чем ты
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
20.10.2008, 13:56     operator = #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;
};
Программа заодно и с распространенной ошибкой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2008, 14:04     operator =
Еще ссылки по теме:

operator() C++
C++ Operator=
C++ Operator +
C++ Operator*
C++ Вызов operator[] через operator[] const

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

Или воспользуйтесь поиском по форуму:
Жестянка
сцуко киборг
 Аватар для Жестянка
102 / 29 / 2
Регистрация: 11.09.2008
Сообщений: 193
20.10.2008, 14:04  [ТС]     operator = #20
Vourhey, всё понятно.
Тоесть, надо писать delete []m; внутри деструктора, для собственных переменных. Если объект создается через new надо удалять его delet'ом. В остальных случаях всё и так удалится.

cyberguru.ru

Добавлено через 5 минут 48 секунд
XuTPbIu_MuHTAu,
...в противном случае вашу программу ждет крах
Моя программа уже прекрастно работает. Конечно, благодаря вам.
Yandex
Объявления
20.10.2008, 14:04     operator =
Ответ Создать тему
Опции темы

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