Russian Qt Forum

Qt => Общие вопросы => Тема начата: zodiac от Июль 17, 2010, 16:36



Название: Приватный класс
Отправлено: zodiac от Июль 17, 2010, 16:36
Здравствуйте! При использовании приватных классов столкнулся с небольшой проблемой.
Вот сам класс:
smthinfo.h:
Код:
	class SmthInfoPrivate;

class SmthInfo
{
Q_DECLARE_PRIVATE( SmthInfo )
public:
SmthInfo( const QString &name );
SmthInfo( const SmthInfo &info );
SmthInfo &operator=( const SmthInfo &info );
~SmthInfo();

const QString &name() const;
void setName( const QString &name );
private:
SmthInfoPrivate * const d_ptr;
};

smthinfo_p.h:
Код:
	class SmthInfoPrivate
{
public:
QString name;
};

smthinfo.cpp:
Код:
	SmthInfo::SmthInfo( const QString &name ) : d_ptr( new SmthInfoPrivate )
{
setName( name );
}

SmthInfo::SmthInfo( const SmthInfo &info ) : d_ptr( info.d_ptr )
{
}

SmthInfo &SmthInfo::operator=( const SmthInfo &info )
{
( SmthInfoPrivate * )d_ptr = info.d_ptr;

return *this;
}

SmthInfo::~SmthInfo()
{
Q_D( SmthInfo );

delete d;
}

const QString &SmthInfo::name() const
{
Q_D( const SmthInfo );

return d->name;
}

void SmthInfo::setName( const QString &name )
{
Q_D( SmthInfo );

d->name = name;
}

Дело в том, что если делать так:
Код:
		{
SmthInfo s( "name" );
{
SmthInfo pinfo( "name 2" );
s = pinfo;
}
qDebug( "!!!", qPrintable( s.name() ) );
}
то приложение вылетает. Как я понял, это происходит из-за того, что объект уже будет удален к вызову name(). Если да, то как это исправить?


Название: Re: Приватный класс
Отправлено: asvil от Июль 17, 2010, 17:29
Использовать QSharedDataPointer
qthelp://com.trolltech.qt.460/qdoc/qshareddatapointer.html


Название: Re: Приватный класс
Отправлено: Авварон от Июль 17, 2010, 17:32
есть идея что вот это
Код:
d_ptr( info.d_ptr )
копирует указатель, а не то, что вы хотели сделать


Название: Re: Приватный класс
Отправлено: zodiac от Июль 17, 2010, 17:56
Использовать QSharedDataPointer
qthelp://com.trolltech.qt.460/qdoc/qshareddatapointer.html
В этом случае тогда не надо будет использовать Q_D()?

есть идея что вот это
Код:
d_ptr( info.d_ptr )
копирует указатель, а не то, что вы хотели сделать
Да я тоже так думал, но не нашел как исправить)


Название: Re: Приватный класс
Отправлено: zodiac от Июль 17, 2010, 19:54
Посмотрим, что будет. поправил вот так:
Цитировать
   SmthInfo::SmthInfo( const SmthInfo &info ) : d_ptr( new SmthInfoЗкшмфеу )
   {
      *d_ptr = *info.d_ptr;
   }

   SmthInfo &SmthInfo::operator=( const SmthInfo &info )
   {
      *d_ptr = *info.d_ptr;

      return *this;
   }


Название: Re: Приватный класс
Отправлено: asvil от Июль 17, 2010, 21:26
Q_D надо будет использовать пока используется Q_DECLARE_PRIVATE.
А вообще, чего необходимо добиться?
Как QString общие данные у объектов, пока кто-нибудь из экземпляров не начнет запись? Если да, еще раз отправляю вас на ниже указанную ссылку.


Название: Re: Приватный класс
Отправлено: kuzulis от Июль 18, 2010, 14:22
zodiac,

на сайте habrahabr.ru  есть  две оч хорошие статьи про приватные классы. Поищи. Там все разжевано с примерами.


Название: Re: Приватный класс
Отправлено: zodiac от Июль 18, 2010, 15:36
Q_D надо будет использовать пока используется Q_DECLARE_PRIVATE.
А вообще, чего необходимо добиться?
Как QString общие данные у объектов, пока кто-нибудь из экземпляров не начнет запись? Если да, еще раз отправляю вас на ниже указанную ссылку.
Все-таки сделал как написал выше. Работает аналогично QString.

zodiac,
на сайте habrahabr.ru  есть  две оч хорошие статьи про приватные классы. Поищи. Там все разжевано с примерами.
Две? Спасибо, а то я читал только одну.


Название: Re: Приватный класс
Отправлено: asvil от Июль 18, 2010, 15:48
Как вам угодно.