сцуко киборг
103 / 30 / 4
Регистрация: 11.09.2008
Сообщений: 193
|
|
1 | |
operator =18.10.2008, 22:52. Показов 1942. Ответов 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
|
18.10.2008, 22:52 | |
Ответы с готовыми решениями:
19
Перегрузка операторов operator> и operator* для чисел в разных системах счисления Class & operator's |Error: undefined reference to operator operator char() или operator int() Перегрузка operator>> и operator<< в абстрактном классе |
Почетный модератор
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(); }
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
|
сцуко киборг
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!
Хотя и не совсем так, как хотелось бы... т.к. Подпрограмма может вызываться десятки раз за работу основной проги... И каждый раз после неё будет оставаться захапанным кусок оперативки размером в массив дабулов, содержащий от 4 до 40 000 эллементов, что печально. Нет ли какова-нить другого места для корректного вызова деструктора? Добавлено через 54 минуты 24 секунды к тому же указатель на объект как раз благополучно удаляется при выходе из функции... Так что получается как с сусликом... Или событие onexit есть у функций? Тогда как написать его обработку?
0
|
сцуко киборг
103 / 30 / 4
Регистрация: 11.09.2008
Сообщений: 193
|
|
20.10.2008, 12:00 [ТС] | 9 |
Vourhey, спасиботак и буду.
delete даже не пригодился. После очередной компеляции деструктор начал вызываться сам. Балдею от билдера.
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 |
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 |
Запутали, блин, юзера! Ещё гуру называюцца.
Естественно, я не ногами деструкторы пишу. Но если написано: delete []m;, значит удаляет сётаки. Так?
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
20.10.2008, 13:46 | 16 |
Деструктор не удаляет объект, я еще раз говорю. Дестркутор это просто функция. Просто функция, которая вызывается перед удалением объекта. Служит она для того, чтобы ты почистила за собой внутренние структуры объекта. Сам деструктор не удалит объект!.
Вот сама подумай-ка. Что если я сделаю пустой деструктор. Судя по тому, что ты написала, такой объект не удалится, так деструктор ничего не делает. Но это бред полный. Я вызову: Код
delete obj; Так же как и конструктор не создает сам объект. В нем ты просто выделяешь память под свои внутренние струтуры. Оператор new же не знает о них. Добавлено через 2 минуты 21 секунду Объект да. Но если объявить указатель на объект и выделить память, например, new он не должен его удалить. По крайней мере, у меня никогда не удалял. Да и с чего бы. Это же указатель. Я спокойно могу создать указатель на объект, создать объект, вернуть указатель и работать с объектом вне функции. А в конце работы проги вызвать delete. Добавлено через 1 минуту 4 секунды Так. Только деструктор тут не при чем. А вызывать деструктор напрямую это убожество просто не делай никогда так 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(); }
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 | |
20.10.2008, 14:04 | |
Помогаю со студенческими работами здесь
20
Вызов operator[] через operator[] const Реализация operator + через operator += Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" Operator +, operator += — какой через какой реализовывать? Чем "operator *=" отличается от "operator *"? Expected init-declarator before "operator".expected `,' or `;' before "operator" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |