crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> передача QString функции собственному классу
danya
  опции профиля:
сообщение 10.11.2010, 13:50
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 30.10.2010
Пользователь №: 2164

Спасибо сказали: 0 раз(а)




Репутация:   0  


попробовал сделать следующим образом:
в основной форме:
QString str = QFileDialog::getOpenFileName(this, "Select File", "", "*.ini");
    base::base file;
    flat=file.open_base(str);

в классе есть функция:
int base::open_base(QString file)
{
    QSettings baza(file,QSettings::IniFormat);
    baza.beginGroup("Config");
    flat=baza.value("FLATS","").toInt();
    return flat;
}

в результате получаю ошибку:
error: no match for call to '(QSettings) (QString&, QSettings::Format)'

подскажите что я делаю не так или хотябы что в какую сторону копять?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 10.11.2010, 13:57
Сообщение #2


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Все, вроде, правильно. Версия Кьюта какая?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
danya
  опции профиля:
сообщение 10.11.2010, 14:20
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 30.10.2010
Пользователь №: 2164

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(panter_dsd @ 10.11.2010, 14:57) Link
Все, вроде, правильно. Версия Кьюта какая?

4.7.0
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 10.11.2010, 14:48
Сообщение #4


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Интересно. Код сюда приложить сможешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 10.11.2010, 14:53
Сообщение #5


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(danya @ 10.11.2010, 13:50) Link
error: no match for call to '(QSettings) (QString&, QSettings::Format)'

по-моему такая ошибка если из текущей области видимости(в данном случае файла) не видно обЪявления функции(в данном случае конструктора QSettings) проще говоря предполагаю что не хватает # include <QtCore/QSettings> в файле в котором ошибка.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 10.11.2010, 14:56
Сообщение #6


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Тогда писало бы что
Цитата
error: 'QSettings' was not declared in this scope
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
danya
  опции профиля:
сообщение 10.11.2010, 15:11
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 30.10.2010
Пользователь №: 2164

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(panter_dsd @ 10.11.2010, 15:48) Link
Интересно. Код сюда приложить сможешь?

да конечно
только не пугайтесь на кол-во закомментированного кода
я ведь только учусь:) Link
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 10.11.2010, 15:17
Сообщение #8


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Там совсем в другом ошибка:
1. base::base file; замени на base file;
2. В base.cpp
baza(file,QSettings::IniFormat); замени на QSettings baza(file,QSettings::IniFormat);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 10.11.2010, 15:27
Сообщение #9


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(panter_dsd @ 10.11.2010, 15:17) Link
2. В base.cpp
baza(file,QSettings::IniFormat); замени на QSettings baza(file,QSettings::IniFormat);

в приведенном в посте коде так и есть. или я туплю?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 10.11.2010, 15:28
Сообщение #10


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Ты прав. Но в исходниках другое. ТС походу запутался немного. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
danya
  опции профиля:
сообщение 10.11.2010, 15:28
Сообщение #11


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 30.10.2010
Пользователь №: 2164

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(panter_dsd @ 10.11.2010, 16:17) Link
Там совсем в другом ошибка:
1. base::base file; замени на base file;
2. В base.cpp
baza(file,QSettings::IniFormat); замени на QSettings baza(file,QSettings::IniFormat);

2 так раньше и было)
а вот первое действительно тупанул спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 10.11.2010, 15:58
Сообщение #12


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


danya,
у тебя же есть член класса baza зачем локальную переменную в функции open_base тоже называешь baza при том она того же типа что и член класса!
Это тебя путает. Так делать не рекомендуется. назови по другому.

А если ты хочешь инициализировать член класса с именем baza то тебе надо написать не
baza(file,QSettings::IniFormat);
и не
QSettings baza(file,QSettings::IniFormat);
а
baza = QSettings(file,QSettings::IniFormat);
к моменту вызова open_base baza уже существует созданная конструктором по умолчанию.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
danya
  опции профиля:
сообщение 10.11.2010, 19:39
Сообщение #13


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 30.10.2010
Пользователь №: 2164

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(kwisp @ 10.11.2010, 16:58) Link
danya,
у тебя же есть член класса baza зачем локальную переменную в функции open_base тоже называешь baza при том она того же типа что и член класса!
Это тебя путает. Так делать не рекомендуется. назови по другому.

А если ты хочешь инициализировать член класса с именем baza то тебе надо написать не
baza(file,QSettings::IniFormat);
и не
QSettings baza(file,QSettings::IniFormat);
а
baza = QSettings(file,QSettings::IniFormat);
к моменту вызова open_base baza уже существует созданная конструктором по умолчанию.

сделал)
появилась следующая ошибка
 error: 'QSettings& QSettings::operator=(const QSettings&)' is private

в
baza = QSettings(file,QSettings::IniFormat);

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.11.2010, 20:13
Сообщение #14


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Всё верно, QSettings не имеет отрытого оператора присваивания и конструктора копирования.
Этот класс предназначен для создания локальной переменной, так всюду в примерах и применяется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 11.11.2010, 11:32
Сообщение #15


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


danya,
я просто исходники твои скачал.
про то что оператор копирования закрыт это я проглядел в документации.
получается тебе не нужны члены класса QSettings baza и еще какой то не помню уже т.к. исходники удалил:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
danya
  опции профиля:
сообщение 11.11.2010, 13:45
Сообщение #16


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 30.10.2010
Пользователь №: 2164

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(kwisp @ 11.11.2010, 12:32) Link
danya,
я просто исходники твои скачал.
про то что оператор копирования закрыт это я проглядел в документации.
получается тебе не нужны члены класса QSettings baza и еще какой то не помню уже т.к. исходники удалил:)

да я уже по другому сделал сделал общим переменную file вообщем сейчас всё работает спасибо всем :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 1.12.2010, 6:56
Сообщение #17


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Не следует передавать QString через копию. Лучше — через константную ссылку: int base::open_base(const QString &file). Такой метод будет вызываться быстрее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.12.2010, 7:45
Сообщение #18


фрилансер
******

Группа: Участник
Сообщений: 2946
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Obey-Kun, иногда бывает так, что нет объекта, ссылку на который можно передать :) Тогда лучше иметь перегрузку с параметром по значению
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 1.12.2010, 10:54
Сообщение #19


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 1.12.2010, 7:45) Link
Obey-Kun, иногда бывает так, что нет объекта, ссылку на который можно передать :) Тогда лучше иметь перегрузку с параметром по значению

Так перегрузку или параметр по умолчанию? :)

Перегрузка:
myMethod(const QString &string);
myMethod();


Параметр по умолчанию:
myMethod(QString string = "");


Я бы второго избегал именно потому, что во всех случаях, когда используется не параметр по умолчанию, оно будет работать медленнее, чем могло бы.

Сообщение отредактировал Obey-Kun - 1.12.2010, 10:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.12.2010, 11:22
Сообщение #20


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Obey-Kun @ 1.12.2010, 8:56) Link
Такой метод будет вызываться быстрее.
в общем случае да, а в с лучае с QString - нет. Т.к. QString копирует данные, только при изменении оригинала/копии.
Этот класс специально оптимизирован
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.12.2010, 12:02
Сообщение #21


фрилансер
******

Группа: Участник
Сообщений: 2946
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(Obey-Kun @ 1.12.2010, 12:54) Link
Так перегрузку или параметр по умолчанию

про перегрузку

myMethod(const QString &string); //тут можно передать ссылку на QString
myMethod(const QString string); // а тут можно просто строку символов. Объект QString создастся и будет равносильно передаче по значению

но зато гибко :)





Цитата(Litkevich Yuriy @ 1.12.2010, 13:22) Link
QString копирует данные,

мфсишный CString себя так же ведёт :) Я однажды это для себя открыл вдруг - передал в функцию CString по значению, потом в функции редактировал внутренний буфер вручную. Хоп! Смотрю, внешний объект тоже поменялся )) Костыль - сначала явно скопировать в другой объект.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 1.12.2010, 12:05
Сообщение #22


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Да, забыл об implicit sharing.

Но в любом случае, для передачи объектов, sizeof которых больше sizeof указателя (а это ограничивается почти всеми стандартными типами и элементами enum'ов), в качестве аргументов, во всех методах в Qt применяются именно константные ссылки, куда ни глянь.

Возможно, потому, что тут всё равно приходится совершать какие-никакие действия по копированию объекта.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 1.12.2010, 12:06
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Что-то я не пойму о чем речь?
И первый и второй метод спокойно можно вызывать так:
myMethod( "text" );


В обоих случаях будет создан временный объект QString.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 1.12.2010, 12:08
Сообщение #24


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Если ты о моём примере, то нет, при передаче по ссылке никакой копии создаваться не будет.
При передаче по копии, будет создана копия, но содержимое QString (буковки) не будут копироваться (из-за Impicit Sharing).

Сообщение отредактировал Obey-Kun - 1.12.2010, 12:09
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.12.2010, 12:09
Сообщение #25


фрилансер
******

Группа: Участник
Сообщений: 2946
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


BRE, да, но когда передаёшь QString, не происходить аллокации для строки, а когда передаётся строку символов, происходит создание объекта и аллокация памяти под копию буфера символов. Вот об этом речь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 1.12.2010, 12:11
Сообщение #26


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


По моему, чем делать заведомо менее эффективный метод для иллюзии удобства, лучше делать так:
myFunc(const QString &string) {
    qDebug() << string;
}

QString s("tatata");
myFunc(s);
myFun(QString("nanana"));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.12.2010, 12:15
Сообщение #27


фрилансер
******

Группа: Участник
Сообщений: 2946
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Obey-Kun, визуальное загромождение кода тоже мало способствует удобству :) Мы же знаем, что QString так работает (да и сами разработчики так его применяют - это о чём-то говорит).
А в общем случае, конечно, по ссылке или по указателю большие объекты передавать следует. За исключением случаев, когда внутренний объект будет меняться - тогда проще сразу на стеке его и создать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 1.12.2010, 12:15
Сообщение #28


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Если методу нужен в качестве параметра QString, то по любому нужно создавать объект.
А передача константной ссылки всегда "легче" чем передача по значению, хотя с классами используемыми implicit sharing это и не так явно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 1.12.2010, 12:20
Сообщение #29


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 1.12.2010, 12:15) Link
Obey-Kun, визуальное загромождение кода тоже мало способствует удобству :) Мы же знаем, что QString так работает (да и сами разработчики так его применяют - это о чём-то говорит).
А в общем случае, конечно, по ссылке или по указателю большие объекты передавать следует. За исключением случаев, когда внутренний объект будет меняться - тогда проще сразу на стеке его и создать


Поищите, например, setName в документации. Да у них там везде QString передаётся по константной ссылке. Абсолютно везде.
При создании копии QString, несмотря на общее использование данных, кое-какие лишние действия всё равно будут проводиться.

Цитата
А передача константной ссылки всегда "легче" чем передача по значению, хотя с классами используемыми implicit sharing это и не так явно.

Вот именно. Но разница всё равно есть. И разработчики Qt, видимо, посчитали её значительной, иначе в собственных методах использовали бы передачу QString по значению.

Сообщение отредактировал Obey-Kun - 1.12.2010, 12:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.12.2010, 12:31
Сообщение #30


фрилансер
******

Группа: Участник
Сообщений: 2946
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Obey-Kun, непонятно, о чём такой долгий спор :) Всем и так известно, что ссылка (или указатель) передаётся быстрее и меньше стека есть. Думаешь, Антарктиду открыл ? ;)
Только в каждом случае , когда пишешь свою функцию, нужно продумывать интерфейс, так как тупо всегда ссылку или указатель нельзя передавать. Бывает так, что надо именно объект, чтобы он сразу скопировался
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 3.1.2026, 7:56