Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
danya |
10.11.2010, 13:50
Сообщение
#1
|
|
Студент ![]() Группа: Новичок Сообщений: 10 Регистрация: 30.10.2010 Пользователь №: 2164 Спасибо сказали: 0 раз(а) Репутация: 0
|
попробовал сделать следующим образом:
в основной форме: в классе есть функция: в результате получаю ошибку: подскажите что я делаю не так или хотябы что в какую сторону копять? |
|
|
|
|
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 Интересно. Код сюда приложить сможешь? да конечно только не пугайтесь на кол-во закомментированного кода я ведь только учусь |
|
|
|
|
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 уже существует созданная конструктором по умолчанию. сделал) появилась следующая ошибка в |
|
|
|
|
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, иногда бывает так, что нет объекта, ссылку на который можно передать Так перегрузку или параметр по умолчанию? Перегрузка: Параметр по умолчанию: Я бы второго избегал именно потому, что во всех случаях, когда используется не параметр по умолчанию, оно будет работать медленнее, чем могло бы. Сообщение отредактировал 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 себя так же ведёт |
|
|
|
|
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
|
Что-то я не пойму о чем речь?
И первый и второй метод спокойно можно вызывать так: В обоих случаях будет создан временный объект 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
|
По моему, чем делать заведомо менее эффективный метод для иллюзии удобства, лучше делать так:
|
|
|
|
|
Алексей1153 |
1.12.2010, 12:15
Сообщение
#27
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Obey-Kun, визуальное загромождение кода тоже мало способствует удобству
А в общем случае, конечно, по ссылке или по указателю большие объекты передавать следует. За исключением случаев, когда внутренний объект будет меняться - тогда проще сразу на стеке его и создать |
|
|
|
|
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, визуальное загромождение кода тоже мало способствует удобству А в общем случае, конечно, по ссылке или по указателю большие объекты передавать следует. За исключением случаев, когда внутренний объект будет меняться - тогда проще сразу на стеке его и создать Поищите, например, 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.1.2026, 7:56 |