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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Указатели в qt 4.5  (Прочитано 12639 раз)
ритт
Гость
« Ответ #15 : Июнь 28, 2009, 04:41 »

2 Константин у человека как оказалось уже другая проблема, его уже не QString интересует а то как вообще оптимизировать и не передовать копии виджетов, только он еще не описал это более подробно.
f-r-o-s-t, у тебя та же проблема, что и у автора? ))
Записан
f-r-o-s-t
Гость
« Ответ #16 : Июнь 28, 2009, 10:14 »

У меня нет, хотел помочь ему =)
Записан
SABROG
Гость
« Ответ #17 : Июнь 28, 2009, 11:06 »

не создавая 100 копий данных. Насчет того, что я ламер в qt\c++ - и так понятно, поэтому и прошу совета на этом форуме.  Плачущий
Копию данных на любые классы на базе QObject создать не получится в любом случае, там конструктор копирования вынесен в protected секцию.

У некоторых классов Qt реализована технология совместного владения данными (Implicit Sharing), там хоть 1000 раз скопируй на все 1000 экземпляров будет один и тот же указатель, до тех пор, пока у одного такого экземпляра не возникнет необходимость изменить содержимое, тогда сделается копия.

Вот список таких классов:

QBitArray, QBitmap, QBrush, QByteArray, QCache, QCursor, QDir, QFileInfo, QFont, QFontInfo, QFontMetrics, QFontMetricsF, QGLColormap, QGradient, QHash, QIcon, QImage, QKeySequence, QLinkedList, QList, QLocale, QMap, QMultiHash, QMultiMap, QPainterPath, QPalette, QPen, QPicture, QPixmap, QPolygon, QPolygonF, QQueue, QRegExp, QRegion, QSet, QSqlField, QSqlQuery, QSqlRecord, QStack, QString, QStringList, QTextBoundaryFinder, QTextCursor, QTextDocumentFragment, QTextFormat, QUrl, QVariant, QVector

Насчет ссылок и указателей тебе уже сказали.
Записан
spectre71
Гость
« Ответ #18 : Июнь 28, 2009, 11:53 »

У некоторых классов Qt реализована технология совместного владения данными (Implicit Sharing), там хоть 1000 раз скопируй на все 1000 экземпляров будет один и тот же указатель, до тех пор, пока у одного такого экземпляра не возникнет необходимость изменить содержимое, тогда сделается копия.
Не может такого быть!
  QString* aaa = new QString("test");
  QString* bbb = new QString("test");
У казатели aaa и bbb не будут одинаковы, объекты будут разные!!!
А вот некоторые данные внутри вполне могут ссылаться на один и тот же объект.
Хотя у меня даже это не прокатило - см. картинку.
Записан
SABROG
Гость
« Ответ #19 : Июнь 28, 2009, 12:07 »

Не может такого быть!
  QString* aaa = new QString("test");
  QString* bbb = new QString("test");

Ты не правильно используешь этот класс, надо так:

Код:
  QString* aaa = new QString("test");
  QString* bbb = new QString(aaa);

Ну или так:

Код:
QString aaa("test");
QString bbb(aaa);

Говоря об указателе я имею ввиду некую переменную внутри класса, которая будет ссылаться на одни и те же данные.
Записан
yesrus
Гость
« Ответ #20 : Июнь 28, 2009, 14:25 »

2SABROG Спасибо! Самый полезный пост в теме!
2Константин Так же спасибо! Ваш пример показал где ошибка, а именно:
Код
C++ (Qt)
QString test="privet";
func1(&test);
......................
.....::func1(QString *test)
{
QString test2=test;
}
а нужно было QString test2=*test
Все заработало.


п.с. 2f-r-o-s-t - не копию виджета, а копию данных передаваемых в виджет. Извиняюсь, если начальное описание проблемы было несколько сумбурным =)
« Последнее редактирование: Июнь 28, 2009, 14:27 от yesrus » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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