2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Объект класса и Аргумент функции
Сообщение13.01.2006, 09:15 
столкнулся с таким вопросом:
Код:
class A
{
        int    *i;
public:
         A(int n) { i=new int; *i=n; }
        ~A() { delete i; }
};

void B(A a)
{
        return;
}

void main()
{
        A       a(10);
        B(a);
}

Дык вот, когда доходит до return у функции B, то вызывается деструктор аргумента функции, который является обьектом класса A. Но поле i объекта A и аргумента функции ссылаются на одно и тоже место. Получается, что после завершения функции, мы теряем информацию на которую указывало поле i класс A. Так ? :)

 
 
 
 
Сообщение13.01.2006, 09:31 
Аватара пользователя
Так. В классе A не хватает copy-конструктора. Типа такого:
Код:
A(const A& a) { i=new int; *i=*(a.i); }

 
 
 
 
Сообщение13.01.2006, 09:49 
мне здесь copy-конструктор и не нужен был, задача ставилась другая :)

 
 
 
 
Сообщение13.01.2006, 10:15 
Аватара пользователя
undef писал(а):
мне здесь copy-конструктор и не нужен был, задача ставилась другая :)


Даже если и другая задача, без конструктора копирования здесь не обойтись. По той причине, что при передаче в функцию "по значению" , как у Вас, автоматически по-умолчанию (т.е. если отсутствует заданный Вами конструктор копирования) создается копия исходного объекта, у которой все поля равны полям исходного объекта (в том числе, и указатели-члены класса). Потом для этого объекта-копии вызывается деструктор(который освобождает память, указываемую указателями-членами :) ), а поскольку значения указателей-членов класса одинаковы, то во втором (исходном) экземпляре объекта указатели-члены уже будут указывать на уже освобожденную память.. Вот что б этих казусов не происходило, и нужен конструктор копирования, который будет корректно создавать копии, а не абы как, как это делает C++ по-умолчанию!
Уффф.. Длинно получилось и с тафтологией... :)

 
 
 
 
Сообщение13.01.2006, 10:18 
все, я понял смысл :D
спасибо

 
 
 
 
Сообщение13.01.2006, 10:34 
Аватара пользователя
Вообще, если в лом делать конструктор копирования, то надо передавать объект не по значению, а по указателю или ссылке... Но лучше его все-таки сделать! :)

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group