Russian Qt Forum
Октябрь 02, 2024, 17:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Приватный класс  (Прочитано 4625 раз)
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(). Если да, то как это исправить?
Записан
asvil
Гость
« Ответ #1 : Июль 17, 2010, 17:29 »

Использовать QSharedDataPointer
qthelp://com.trolltech.qt.460/qdoc/qshareddatapointer.html
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Июль 17, 2010, 17:32 »

есть идея что вот это
Код:
d_ptr( info.d_ptr )
копирует указатель, а не то, что вы хотели сделать
Записан
zodiac
Гость
« Ответ #3 : Июль 17, 2010, 17:56 »

Использовать QSharedDataPointer
qthelp://com.trolltech.qt.460/qdoc/qshareddatapointer.html
В этом случае тогда не надо будет использовать Q_D()?

есть идея что вот это
Код:
d_ptr( info.d_ptr )
копирует указатель, а не то, что вы хотели сделать
Да я тоже так думал, но не нашел как исправить)
Записан
zodiac
Гость
« Ответ #4 : Июль 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;
   }
Записан
asvil
Гость
« Ответ #5 : Июль 17, 2010, 21:26 »

Q_D надо будет использовать пока используется Q_DECLARE_PRIVATE.
А вообще, чего необходимо добиться?
Как QString общие данные у объектов, пока кто-нибудь из экземпляров не начнет запись? Если да, еще раз отправляю вас на ниже указанную ссылку.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Июль 18, 2010, 14:22 »

zodiac,

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

ArchLinux x86_64 / Win10 64 bit
zodiac
Гость
« Ответ #7 : Июль 18, 2010, 15:36 »

Q_D надо будет использовать пока используется Q_DECLARE_PRIVATE.
А вообще, чего необходимо добиться?
Как QString общие данные у объектов, пока кто-нибудь из экземпляров не начнет запись? Если да, еще раз отправляю вас на ниже указанную ссылку.
Все-таки сделал как написал выше. Работает аналогично QString.

zodiac,
на сайте habrahabr.ru  есть  две оч хорошие статьи про приватные классы. Поищи. Там все разжевано с примерами.
Две? Спасибо, а то я читал только одну.
Записан
asvil
Гость
« Ответ #8 : Июль 18, 2010, 15:48 »

Как вам угодно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 22.