Re: CArray + Template
От: Denwer Россия  
Дата: 22.09.03 05:13
Оценка: 3 (1)
Здравствуйте, fin, Вы писали:

fin>Имеется класс:

fin>
fin>MyClass::MyClass()
fin>{
fin>    printf("MyClass::MyClass()\n");
fin>}

fin>MyClass::~MyClass()
fin>{
fin>    printf("MyClass::~MyClass()\n");
fin>}

fin>MyClass::MyClass(const MyClass &obj)
fin>{
fin>    printf("MyClass::MyClass(const MyClass &obj)\n");

fin>    sName = obj.sName;
fin>}

fin>MyClass MyClass::operator =(const MyClass &obj)
fin>{
fin>    printf("MyClass MyClass::operator =(const MyClass &obj)\n");

fin>    sName = obj.sName;
fin>    return *this; //Третий вызов конструктора
fin>}
fin>


fin>Код в главной функции

fin>
fin>CArray <MyClass,MyClass&> arrayMyClasses;
fin>cout << "1" << endl;
fin>MyClass obj; //Первый вызов конструктора
fin>cout << "2" << endl;
fin>obj.sName = "Name";
fin>cout << "3" << endl;
fin>arrayMyClasses.Add(obj); //Второй вызов конструктора
fin>cout << "4" << endl;
fin>


fin>И вот такой странный результат на консоли:

fin>
fin>1
fin>MyClass::MyClass()
fin>2
fin>3
fin>MyClass::MyClass()
fin>MyClass MyClass::operator =(const MyClass &obj)
fin>MyClass::MyClass(const MyClass &obj)
fin>MyClass::~MyClass()
fin>4
fin>MyClass::~MyClass()
fin>MyClass::~MyClass()
fin>


fin>Почему деструктор вызывается трижды?


Ну все правельно, потому что трижды вызывается конструктор. Кстати на один вызов можно сократить если в операторе присваивания сделать возврат ссылки, тогда вызов конструктора копирования не произойдет(соответсвенно сократится на один и вызов деструктора).

Оставшиеся два вызова конструктора: при создании твоего объекта, и при создании объекта в массиве, ты же там хранишь если так можно сказать копии объектов которые передаешь в функцию Add, если хочешь и этого избежать то сохраняй указатели. Ну соответсвенно тогда получится и деструкторов столько сколько конструкторов(имеется кол-во вызовов конечно).

CArray <MyClass*,MyClass*> arrayMyClasses;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.