Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PIMPL+auto_ptr на VS2010, проблема реализации 
V
    Опции темы
azesmcar
Дата 22.1.2011, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Добрый вечер,

Есть такая проблема. Реализую PIMPL с использованием умных указателей.
Код:
x.h
Код

#ifndef x_h_included
#define x_h_included

#include <memory>

class XImpl;
class X
{
public:
    X();
    ~X();
    std::auto_ptr<XImpl> impl;
};

#endif // x_h_included

x.cpp
Код

#include "ximpl.h"
#include "x.h"

X::X()
{
}

X::~X()
{

}

ximpl.h
Код

#ifndef ximpl_h_included
#define ximpl_h_included

class XImpl
{
public:
    XImpl() {};
    ~XImpl() {};
};

#endif // ximpl_h_included

все нормально, все работает как и положено, но как только я реализую конструктор класса X в заголовочном файле (x.h) VS2010 начинает выдавать warning, что std::auto_ptr мол деструктора не видит (хотя он есть). gcc молчит, все в порядке..опять в микрософт что-то намудрили или так и положено? С решением все просто - отказаться от использования std::auto_ptr и удалять в деструкторе самому, но зачем?

Это сообщение отредактировал(а) azesmcar - 22.1.2011, 22:46
PM   Вверх
alexvs11
Дата 22.1.2011, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 6
Всего: 10



azesmcar, auto_ptr не умный, а очень даже глупый указатель
разве shared_ptr не включили в новый стандарт?
PM MAIL   Вверх
azesmcar
Дата 22.1.2011, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(alexvs11 @  22.1.2011,  22:48 Найти цитируемый пост)
azesmcar, auto_ptr не умный, а очень даже глупый указатель

с каких это пор?

Цитата(alexvs11 @  22.1.2011,  22:48 Найти цитируемый пост)
разве shared_ptr не включили в новый стандарт? 

в тот, который еще не вышел?

PM   Вверх
alexvs11
Дата 22.1.2011, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 6
Всего: 10



на rsdn'e четко рассказано в чем соль
http://www.rsdn.ru/article/cpp/smartptr.xml#EMD
в немногих случаях, когда я видел применение auto_ptr это было связано с глюками, которых не было бы без его применения, а в vs для wince я помню он вообще не был полностью реализован  smile 
а shared_ptr уже в std::tr1, так что скоро будет в стандарте

Это сообщение отредактировал(а) alexvs11 - 22.1.2011, 23:04
PM MAIL   Вверх
mes
Дата 22.1.2011, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



auto_ptr должен видеть деструктор того класса..


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 22.1.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mes @  22.1.2011,  23:02 Найти цитируемый пост)
auto_ptr должен видеть деструктор того класса.. 

Я знаю, деструктор есть. На работоспособность программы влияет не наличие деструктора, а реализация конструктора в заголовочном файле. Каким образом это связано? auto_ptr должен удаляться в деструкторе класса X, деструктор реализован в cpp файле (x.cpp), где реализация XImpl уже видна.

Цитата(alexvs11 @  22.1.2011,  23:02 Найти цитируемый пост)
на rsdn'e четко рассказано в чем соль

соль чего? auto_ptr? я с ним знаком и он меня более чем устраивает для текущей задачи.

Цитата(alexvs11 @  22.1.2011,  23:02 Найти цитируемый пост)
а shared_ptr уже в std::tr1, так что скоро будет в стандарте

скоро, не скоро..не все компиляторы его на сегодняшний день поддерживают. И кстати shared_ptr не замена auto_ptr, они для разных целей служат.

Это сообщение отредактировал(а) azesmcar - 22.1.2011, 23:09
PM   Вверх
mes
Дата 22.1.2011, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(azesmcar @  22.1.2011,  22:04 Найти цитируемый пост)
auto_ptr должен удаляться в деструкторе класса X, 

нет... деструктор auto_ptr формируется в месте инстантирования тьфу использования.. и там должен быть виден нужный деструктор ..


Это сообщение отредактировал(а) mes - 23.1.2011, 00:00


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 22.1.2011, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mes @  22.1.2011,  23:09 Найти цитируемый пост)
нет... деструктор auto_ptr формируется в месте инстанцирования.. и там должен быть виден нужный деструктор ..

формируется - да, но не вызывается.
а вызывается он уже там, где реализация видна.

код в первом посте нормально компилируется и работает, вопрос в том, что он перестает работать (точнее просто выдает warning) как только я пишу конструктор в заголовочном файле. А я не могу его писать в файле реализации, он шаблонный.

Добавлено через 5 минут и 16 секунд
Цитата(alexvs11 @  22.1.2011,  23:02 Найти цитируемый пост)
в немногих случаях, когда я видел применение auto_ptr это было связано с глюками, которых не было бы без его применения

и о чем это говорит?

Добавлено через 6 минут и 23 секунды
mes

http://www.gotw.ca/publications/mill12.htm
Цитата

A General Technique: Using the Pimpl Idiom

  //  Example 2: The general solution to
  //             Cargill's Widget Example
  //
  class Widget
  {
    // ...

  private:
    class WidgetImpl;
    auto_ptr<WidgetImpl> pimpl_;

    // ... provide destruction, copy construction
    //     and assignment that work correctly, or
    //     suppress them ...
  };

  // Then, typically in a separate
  // implementation file:
  //
  class Widget::WidgetImpl
  {
  public:
    // ...
    T1 t1_;
    T2 t2_;
  };


Это сообщение отредактировал(а) azesmcar - 22.1.2011, 23:15
PM   Вверх
mes
Дата 22.1.2011, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250





--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 22.1.2011, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mes @  22.1.2011,  23:17 Найти цитируемый пост)
http://forum.vingrad.ru/forum/topic-304001..._ptr/index.html 

тут говориться то, о чем пишу я и нет ответа на мой вопрос smile

Добавлено через 22 секунды
Цитата(baldina @  24.6.2010,  11:21 Найти цитируемый пост)
потому что именно в деструкторе ~CMain1() вызывается деструктор auto_ptr и вот в этой точке нужно полное определение CPrivate1, что бы правильно вызвать его деструктор.
т.е. CPrivate1 не надо показывать всем, просто функции, его использующие (в т.ч. ~CMain1()) должны быть в единице компиляции, где он известен 


PM   Вверх
mes
Дата 22.1.2011, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



перечитал еще раз.. понял о чем речь.. да я как то криво читал, сорри.. сейчас обдумаю smile

Добавлено через 5 минут и 18 секунд
Цитата(azesmcar @  22.1.2011,  22:10 Найти цитируемый пост)
. А я не могу его писать в файле реализации, он шаблонный.

мм.. а деструктор шаблона тоже в хидере ?
 


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 22.1.2011, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mes @  22.1.2011,  23:21 Найти цитируемый пост)
мм.. а деструктор шаблона тоже в хидере ?

вот именно что нет, только конструктор..деструктор то я могу перенести в реализацию. Исходник точно такой, как в первом посте (только конструктор шаблонный). Для получения ошибки достаточно заменить в коде из первого поста
Цитата

X();

на
Код

X() {}

и убрать реализацию из cpp файла.

ну в общем-то как я уже писал решение есть и довольно простое, делать new, delete самому, но  хотелось бы разобраться.


Это сообщение отредактировал(а) azesmcar - 22.1.2011, 23:30
PM   Вверх
mes
Дата 23.1.2011, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



полагаю VS формирует _pre-destructor_ там, где формируется конструктор..


Это сообщение отредактировал(а) mes - 23.1.2011, 00:02


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 23.1.2011, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mes @  23.1.2011,  00:02 Найти цитируемый пост)
полагаю VS формирует _pre-destructor_ там, где формируется конструктор..

Это объясняет ошибку, но это странно, что он вызывает деструктор auto_ptr в этом pre деструкторе...а если а в своем деструкторе к нему обращусь?
PM   Вверх
azesmcar
Дата 23.1.2011, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



упс...забыл проинициализировать smile 

ложная тревога

Добавлено @ 08:37
Цитата(mes @  23.1.2011,  00:02 Найти цитируемый пост)
полагаю VS формирует _pre-destructor_ там, где формируется конструктор..

проверил, в деструкторе к impl можно спокойно обращаться, т.е. удаляется объект после выхода из тела деструктора в файле реализации. Почему в таком случае студия хочет деструктора там, где он ей не нужен?

в итоге получается вот это.
работает, но деструктор XImpl не вызывается. smile 

x.h
Код

#ifndef x_h_included
#define x_h_included

#include <memory>

class XImpl;
class X
{
public:
    X()
    {
        init();
    }
    ~X();
private:
    void init();
    std::auto_ptr<XImpl> impl;
};

#endif // x_h_included

ximpl.h
Код

#ifndef ximpl_h_included
#define ximpl_h_included

class XImpl
{
public:
    XImpl() {};
    ~XImpl() {};
    void foo() {}
};

#endif // ximpl_h_included

x.cpp
Код

#include "ximpl.h"
#include "x.h"

X::~X()
{
    impl->foo();
}

void X::init()
{
    impl.reset(new XImpl());
}



Это сообщение отредактировал(а) azesmcar - 23.1.2011, 08:44
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0611 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.