Не компилируется код...
using namespace std;
// ---------------------базовый класс - распределения
class ZRV
{
public:
virtual ~ZRV() {}
virtual const char*PoluchitNaim()=0;
};
// ---------------------- нормальное распределение --------------
class NormalZRV:public ZRV
{
public:
// s - среднее, sig - станд.откл.
NormalZRV(double s, double sig) : s(s), sig(sig),s1("среднее"),sig1("станд.откл."){}
virtual ~NormalZRV() {}
const char*PoluchitNaim() { return "нормальное";}
private:
double s,sig;
char *s1,*sig1;
};
void main(void)
{
typedef auto_ptr<ZRV> pZRV;
typedef map<int, pZRV> ut;
ut a;
a.insert(ut::value_type(1,pZRV(new NormalZRV(1.,1.))));
}
Неужели нельзя создавать map содержащий умный указатель?
Вот такой простой код...
using namespace std;
// ---------------------базовый класс - распределения
class ZRV
{
public:
virtual ~ZRV() {}
virtual const char*PoluchitNaim()=0;
};
// ---------------------- нормальное распределение --------------
class NormalZRV:public ZRV
{
public:
// s - среднее, sig - станд.откл.
NormalZRV(double s, double sig) : s(s), sig(sig),s1("среднее"),sig1("станд.откл."){}
virtual ~NormalZRV() {}
const char*PoluchitNaim() { return "нормальное";}
private:
double s,sig;
char *s1,*sig1;
};
void main(void)
{
typedef auto_ptr<ZRV> pZRV;
typedef map<int, pZRV> ut;
ut a;
a.insert(ut::value_type(1,pZRV(new NormalZRV(1.,1.))));
}
Неужели нельзя создавать map содержащий умный указатель?
А что, лень было прочитать то что пишет компилятор? В данном случае у auto_ptr нет конструктора копирования, поэтому и не компилится... Вообще говоря использование auto_ptr в данном случае является серьезной ошибкой. Если тебе нужны умные указатели, используй boost::shared_ptr...
А что, лень было прочитать то что пишет компилятор? В данном случае у auto_ptr нет конструктора копирования, поэтому и не компилится... Вообще говоря использование auto_ptr в данном случае является серьезной ошибкой. Если тебе нужны умные указатели, используй boost::shared_ptr...
Я понимаю, что нет конструктора копирования у auto_ptr.
Так неужели нельзя создавать map, содержащий умный указатель?
И что такое boost::shared_ptr. Не слышал и в помощи нет.
Я понимаю, что нет конструктора копирования у auto_ptr.
Так неужели нельзя создавать map, содержащий умный указатель?
И что такое boost::shared_ptr. Не слышал и в помощи нет.
:x Как ты представляешь добавление элемента в контейнер без его копирования? Почему нельзя использовать auto_ptr, читай MSDN. Для того чтобы копилялось можно использовать умные указатели, но только те которые ведут подсчет ссылок к объекту, на который указывает умный указатель (типа как в COM). В качестве примера имеется shared_ptr который находится в библиотеке boost
:x Как ты представляешь добавление элемента в контейнер без его копирования? Почему нельзя использовать auto_ptr, читай MSDN. Для того чтобы копилялось можно использовать умные указатели, но только те которые ведут подсчет ссылок к объекту, на который указывает умный указатель (типа как в COM). В качестве примера имеется shared_ptr который находится в библиотеке boost
По поводу auto_ptr - в недоумении - почему его нельзя использовать?
Насчет boost.org скажу свое мнение - в программе лучше использоваться минимальное кол-во различных библиотек.
По поводу auto_ptr - в недоумении - почему его нельзя использовать?
Насчет boost.org скажу свое мнение - в программе лучше использоваться минимальное кол-во различных библиотек.
Эх... Представь, ты добавил auto_ptr в map, при этом (если бы был коструктор копирования) создалась бы копия умного указателя, который, естественно указывает на теже самые данные что и первый auto_ptr. Если по какой-либо причине один из этих двух объектов уничтожится, он в деструкторе похерит и данные на которые указывает и следовательно другая копия будет указывать на похеренные данные... Теперь понятно????????
Поэтому в auto_ptr и нет коструктора копирования, дабы исбежать данной ситуации.
Эх... Представь, ты добавил auto_ptr в map, при этом (если бы был коструктор копирования) создалась бы копия умного указателя, который, естественно указывает на теже самые данные что и первый auto_ptr. Если по какой-либо причине один из этих двух объектов уничтожится, он в деструкторе похерит и данные на которые указывает и следовательно другая копия будет указывать на похеренные данные... Теперь понятно????????
Поэтому в auto_ptr и нет коструктора копирования, дабы исбежать данной ситуации.
Спасибо за объяснения. Думал, метод release спасет ситуацию.
Ну что же, придется тогда без умных указателей с map работать.
P.S. Все-таки конструктор копирования там есть, но он особый, работает лишь с указателем на объект