Russian Qt Forum

Qt => Общие вопросы => Тема начата: yesrus от Июнь 27, 2009, 17:51



Название: Указатели в qt 4.5
Отправлено: yesrus от Июнь 27, 2009, 17:51
Вообщем проблема в следующем-как передать в функцию указатель?

Есть некая QString  с данными, и есть функция в которую указатель на эту кустринг надо передать.

пример:

QString test="privet";

func1(&test);
......................
.....::func1(QString *test)
{
QString test2=test;
}


Но вылазит ошибка - error: invalid conversion from `QString*' to `char'
В какую сторону копать...в чем причина ошибки ?


Название: Re: Ссылки в qt 4.5
Отправлено: Пантер от Июнь 27, 2009, 17:59
QString test2=test;
Ты уверен в правильности вот этой строки?
QString *test
QString test2
test2=*test


Название: Re: Ссылки в qt 4.5
Отправлено: f-r-o-s-t от Июнь 27, 2009, 18:30
А где ссылки? тут же указатели =)
я думаю надо так :
Код:
QString test="privet";
func1(test);
......................
.....::func1(QString &test)
{
QString test2=test;
}

проще будет.


Название: Re: Ссылки в qt 4.5
Отправлено: denka от Июнь 27, 2009, 18:46
Вообщем проблема в следующем-как передать в функцию ссылку ?

Есть некая QString  с данными, и есть функция в которую ссылку на эту кустринг надо передать.

пример:

QString test="privet";

func1(&test);
......................
.....::func1(QString *test)
{
QString test2=test;
}


Но вылазит ошибка - error: invalid conversion from `QString*' to `char'
В какую сторону копать...в чем причина ошибки ?

А причем тут Qt ???  Тему надо было озвучить ссылки и указатели в С++.


Название: Re: Ссылки в qt 4.5
Отправлено: ритт от Июнь 27, 2009, 18:48
yesrus, стыдно такое спрашивать! тебе компилятор уже всё сказал - если не понимаешь его речей, го в книжный за "с/с++ для чайников"


Название: Re: Ссылки в qt 4.5
Отправлено: yesrus от Июнь 27, 2009, 22:29
А где ссылки? тут же указатели =)
я думаю надо так :
Код:
QString test="privet";
func1(test);
......................
.....::func1(QString &test)
{
QString test2=test;
}

проще будет.
Сейчас сделано нечто подобное...но на самом деле вызывается не функция...а данные в виджет передаются..и создаются 30-100 дочерних виджетов..и в каждом копия данных, поэтому решил оптимизировать...
По поводу указателей я понимаю, что напрямую он указывает на первый символ строки..но у меня была надежда, что все-же как то можно сделать описанное в первом посте )))


Название: Re: Указатели в qt 4.5
Отправлено: denka от Июнь 27, 2009, 22:40
о_О Парень ты меня вобще удивляешь/*нервно курит в сторонке и чешет затылок*/  Я вот пытаюсь провести какие-то взаимосвязи между тем что сказано в первом посте и последнем и знаешь че-то эти линии аж никак не пересекаються. Как то все началось с сылок на QString оказавшимся указтелем, а закончилось как я понял указателями на С-строки :)


Название: Re: Указатели в qt 4.5
Отправлено: lit-uriy от Июнь 27, 2009, 22:59
>>что напрямую он указывает на первый символ строки
Не путай пользовательский тип (класс) со свстроенным в язык типом


Название: Re: Указатели в qt 4.5
Отправлено: denka от Июнь 27, 2009, 23:04
>>что напрямую он указывает на первый символ строки
Не путай пользовательский тип (класс) со свстроенным в язык типом
О каком встроенном в язык типе идет речь? :)


Название: Re: Указатели в qt 4.5
Отправлено: lit-uriy от Июнь 27, 2009, 23:19
например, масив char'ов, где указатель на масив действительно указывает на первый элемент масива.


Название: Re: Указатели в qt 4.5
Отправлено: denka от Июнь 27, 2009, 23:33
И что будет являться массивом символов но не как не встроенным типом :)
И С-строка так же не является встроенным типом.


Название: Re: Указатели в qt 4.5
Отправлено: yesrus от Июнь 28, 2009, 00:40
Начался флуд...подскажите просто как сделать правильно(кроме глобальных переменных), не создавая 100 копий данных. Насчет того, что я ламер в qt\c++ - и так понятно, поэтому и прошу совета на этом форуме.  :'(


Название: Re: Указатели в qt 4.5
Отправлено: f-r-o-s-t от Июнь 28, 2009, 00:46
А ты более подробно можешь объяснить что у тебя происходит, а то из фразы
Сейчас сделано нечто подобное...но на самом деле вызывается не функция...а данные в виджет передаются..и создаются 30-100 дочерних виджетов..и в каждом копия данных, поэтому решил оптимизировать...
По поводу указателей я понимаю, что напрямую он указывает на первый символ строки..но у меня была надежда, что все-же как то можно сделать описанное в первом посте )))

Мало понятно где что создается и куда передается.


Название: Re: Указатели в qt 4.5
Отправлено: ритт от Июнь 28, 2009, 01:32
QString является шаренным классом, поэтому
Код:
QString f(const QString& s)
{
    QString ret = s;
    return ret;
}
не создаст копию данных, а лишь увеличит значения счётчика.

Код:
QString f(QString* s)
{
    QString ret = *s;
    return ret;
}
также рабочий вариант. по сути мало чем отличается от первого.

для шаренных классов удобнее пользоваться первым вариантом, пока не потребуется что-то вроде:
Код:
bool f(int i, QString* s = 0)
{
    if(i != 2)
    {
        if(s)
            *s = QString("error: i != 2");
        return false;
    }
    return true;
}


Название: Re: Указатели в qt 4.5
Отправлено: f-r-o-s-t от Июнь 28, 2009, 01:54
2 Константин у человека как оказалось уже другая проблема, его уже не QString интересует а то как вообще оптимизировать и не передовать копии виджетов, только он еще не описал это более подробно.


Название: Re: Указатели в qt 4.5
Отправлено: ритт от Июнь 28, 2009, 04:41
2 Константин у человека как оказалось уже другая проблема, его уже не QString интересует а то как вообще оптимизировать и не передовать копии виджетов, только он еще не описал это более подробно.
f-r-o-s-t, у тебя та же проблема, что и у автора? ))


Название: Re: Указатели в qt 4.5
Отправлено: f-r-o-s-t от Июнь 28, 2009, 10:14
У меня нет, хотел помочь ему =)


Название: Re: Указатели в qt 4.5
Отправлено: SABROG от Июнь 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


Насчет ссылок и указателей тебе уже сказали.


Название: Re: Указатели в qt 4.5
Отправлено: spectre71 от Июнь 28, 2009, 11:53
У некоторых классов Qt реализована технология совместного владения данными (Implicit Sharing), там хоть 1000 раз скопируй на все 1000 экземпляров будет один и тот же указатель, до тех пор, пока у одного такого экземпляра не возникнет необходимость изменить содержимое, тогда сделается копия.
Не может такого быть!
  QString* aaa = new QString("test");
  QString* bbb = new QString("test");
У казатели aaa и bbb не будут одинаковы, объекты будут разные!!!
А вот некоторые данные внутри вполне могут ссылаться на один и тот же объект.
Хотя у меня даже это не прокатило - см. картинку.


Название: Re: Указатели в qt 4.5
Отправлено: SABROG от Июнь 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);

Говоря об указателе я имею ввиду некую переменную внутри класса, которая будет ссылаться на одни и те же данные.


Название: Re: Указатели в qt 4.5
Отправлено: yesrus от Июнь 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 - не копию виджета, а копию данных передаваемых в виджет. Извиняюсь, если начальное описание проблемы было несколько сумбурным =)