Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не компилируется код...

284
24 мая 2006 года
michael_is_98
587 / / 25.02.2005
Вот такой простой код...
Код:
#include <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 содержащий умный указатель?
395
24 мая 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by michael_is_98
Вот такой простой код...
Код:
#include <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...

284
25 мая 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by RelB
А что, лень было прочитать то что пишет компилятор? В данном случае у auto_ptr нет конструктора копирования, поэтому и не компилится... Вообще говоря использование auto_ptr в данном случае является серьезной ошибкой. Если тебе нужны умные указатели, используй boost::shared_ptr...


Я понимаю, что нет конструктора копирования у auto_ptr.
Так неужели нельзя создавать map, содержащий умный указатель?
И что такое boost::shared_ptr. Не слышал и в помощи нет.

395
25 мая 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by michael_is_98
Я понимаю, что нет конструктора копирования у auto_ptr.
Так неужели нельзя создавать map, содержащий умный указатель?
И что такое boost::shared_ptr. Не слышал и в помощи нет.

:x Как ты представляешь добавление элемента в контейнер без его копирования? Почему нельзя использовать auto_ptr, читай MSDN. Для того чтобы копилялось можно использовать умные указатели, но только те которые ведут подсчет ссылок к объекту, на который указывает умный указатель (типа как в COM). В качестве примера имеется shared_ptr который находится в библиотеке boost

284
26 мая 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by RelB
:x Как ты представляешь добавление элемента в контейнер без его копирования? Почему нельзя использовать auto_ptr, читай MSDN. Для того чтобы копилялось можно использовать умные указатели, но только те которые ведут подсчет ссылок к объекту, на который указывает умный указатель (типа как в COM). В качестве примера имеется shared_ptr который находится в библиотеке boost


По поводу auto_ptr - в недоумении - почему его нельзя использовать?
Насчет boost.org скажу свое мнение - в программе лучше использоваться минимальное кол-во различных библиотек.

395
26 мая 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by michael_is_98
По поводу auto_ptr - в недоумении - почему его нельзя использовать?
Насчет boost.org скажу свое мнение - в программе лучше использоваться минимальное кол-во различных библиотек.

Эх... Представь, ты добавил auto_ptr в map, при этом (если бы был коструктор копирования) создалась бы копия умного указателя, который, естественно указывает на теже самые данные что и первый auto_ptr. Если по какой-либо причине один из этих двух объектов уничтожится, он в деструкторе похерит и данные на которые указывает и следовательно другая копия будет указывать на похеренные данные... Теперь понятно????????

Поэтому в auto_ptr и нет коструктора копирования, дабы исбежать данной ситуации.

284
28 мая 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by RelB
Эх... Представь, ты добавил auto_ptr в map, при этом (если бы был коструктор копирования) создалась бы копия умного указателя, который, естественно указывает на теже самые данные что и первый auto_ptr. Если по какой-либо причине один из этих двух объектов уничтожится, он в деструкторе похерит и данные на которые указывает и следовательно другая копия будет указывать на похеренные данные... Теперь понятно????????

Поэтому в auto_ptr и нет коструктора копирования, дабы исбежать данной ситуации.


Спасибо за объяснения. Думал, метод release спасет ситуацию.
Ну что же, придется тогда без умных указателей с map работать.

P.S. Все-таки конструктор копирования там есть, но он особый, работает лишь с указателем на объект

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог