Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 28.08.2016
Сообщений: 16
1

QHash со своим объектом внутри - ошибки !

08.02.2017, 16:04. Показов 1575. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всех приветствую !
Есть такой код с пояснениями:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
////////////////
// Wrap.h
////////////////
#include "deck.h"
 
class wrap : public QMainWindow
{
....
private:
   QHash <QByteArray, Deck> DIC
   QByteArray HASH;
}
 
////////////////////
// Wrap.cpp
////////////////////
wrap::wrap(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::wrap)
{ 
   ...
   connect(&DIC[HASH], SIGNAL(progress(ushort)), &progressBarF, SLOT(setProgress(ushort))); // Вызывает ошибки : use of deleted function 'Deck::Deck(const Deck&)' и 'QObject::QObject(const QObject&)' is private в файлах qHash.h и qObject.h !!!!!
 
   // Это было добавлено в код просто для теста
   Deck d;
   DIC[HASH] = d; // вызывает ошибку : use of deleted function 'Deck& Deck::operator=(const Deck&)'
   ...
}
 
////////////////
deck.h
////////////////
 
class Deck : public QObject
{
   ....
}
Итак, конструкция "QHash <QByteArray, Deck> DIC", где Deck - объект - приводит к ошибке use of deleted function 'Deck:: Deck(const Deck&)'. Я конечно понял что тут каким-то образом косвенно удаляется конструктор (и объект ?), но почему, и как это исправить теперь ? Причем если использовать стандартный объект, например QString - никаких проблем не возникает QHash <QByteArray, QString> DIC - компилируется нормально.

Возможно, Я сам где-то затупил в очевидном месте и не вижу этого. В любом случае, сейчас буду сам разбираться, но если кто-то поможет - буду признателен.

 Комментарий модератора 
Для выделения с++ кода Qt используйте тег CPPQT.
Правила именования тем и оформления сообщений в разделе Qt
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2017, 16:04
Ответы с готовыми решениями:

Дочерние окна со своим потоком внутри главного
Возможно ли реализовать приложение следующим образом. Есть главное окно. Внутри него имеются другие...

Статичное поле с движущимся внутри объектом
Задание звучит так: Создать статическое игровое поле, которое имеет границы (границы формы)....

Расположить массивы по своим местам внутри одного большого массива
Здравствуйте. Допустим, имеется массив а, размером 5х10х5, и массив b, размером 5х100. Хотелось бы...

Вывод ошибки из базы со своим сообщением
Здравствуйте! Сделала в программе окно авторизации, для подключения к базе. Ошибки из базы ловлю с...

7
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
08.02.2017, 16:34 2
Класс Deck полностью?
Макрос Q_OBJECT? Конструктор копирования?
0
0 / 0 / 0
Регистрация: 28.08.2016
Сообщений: 16
08.02.2017, 17:59  [ТС] 3
Q_OBJECT присутствовал, а вот конструктора копирования не было. Действительно, при его добавлении ругань на "connect" прекратилась, но при присваивании "DIC[HASH] = d" та же ошибка.

Не совсем понимаю для чего вручную описывать конструктор копирования ? Как Я понимаю C++ автоматом создает его со всеми необходимыми присваиваниями ? Или в QObject конструктор копирования "запрещен" ? Возможно ли наследование от чего-то другого ?

И Я так понял придется перегружать QHash::Hash() ?

Весь класс довольно большой, приведу значимую часть на данный момент:


C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#ifndef DECK_H
#define DECK_H
 
#include <QObject>
#include <QtWidgets>
 
struct tic {
    QString translate;
 
    uint
        tmr;
};
 
class Deck : public QObject
{
    Q_OBJECT
 
public:
    QHash <QString, tic> DIC;
 
    Deck();
    Deck(const Deck &d);
    ~Deck();
 
    QList <QString> Order(PList p);
 
    tic& operator [](QString i) {return DIC[i];}
};
 
 
Deck::Deck() {
   // в оригинале тоже пусто
}
 
Deck::Deck(const Deck &d) {
   // пока ничего не копируется
}
 
Deck::~Deck() {
   // в оригинале тоже пусто
}
 
#endif
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
08.02.2017, 23:35 4
Цитата Сообщение от Inversus Посмотреть сообщение
Или в QObject конструктор копирования "запрещен" ?
Именно так.
1
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
09.02.2017, 09:50 5
Читайте внимательно документацию к классу QObject.

C++ (Qt)
1
use of deleted function 'Deck& Deck::operator=(const Deck&)'
И оператор= не забудьте вписать для своего класса.
Да и в документации сказано еще вот что:
C++ (Qt)
1
 The key type of a QHash must provide operator==() and a global hash function called qHash() (see qHash).
1
66 / 66 / 18
Регистрация: 31.03.2015
Сообщений: 253
09.02.2017, 16:32 6
Не проще ли использовать только указатель на свой клас, вместо пихать в контейнер весь клас?
C++ (Qt)
1
QHash <QByteArray, Deck*> DIC;
0
0 / 0 / 0
Регистрация: 28.08.2016
Сообщений: 16
09.02.2017, 21:52  [ТС] 7
Цитата Сообщение от Горбаг Посмотреть сообщение
use of deleted function 'Deck& Deck::operator=(const Deck&)'
Да, протупил с этим. Оператор = вписал, все ок, спасибо, плюсики поставил. По поводу хеш-функции - пока не надо, ключи нативные.
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
10.02.2017, 09:10 8
Цитата Сообщение от Inversus Посмотреть сообщение
пока не надо
Дело ваше. Но чтобы не гадать потом, откуда вдруг взялись неожиданные ошибки, лучше сразу все сделать по документации.
0
10.02.2017, 09:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2017, 09:10
Помогаю со студенческими работами здесь

Метод с двумя параметрами: операцией над объектом и объектом
Мне нужно сделать статичный метод Write который будет принимать два параметра операция над...

Перехват клавиш "своим" ActiveX-ом внутри "чужого" приложения
Есть какое-то 'чужое' приложение - для примера сойдет Excel. Я вставляю в ячейку свой OCX (при...

qHash
Объясните пожалуйста, по какому принципу функция qHash делает хэш-код? Я не так давно начал изучать...

ошибки в задаче(код внутри)
надо таким макаром ввести сведенья об учащихся а потом пощитать средний бал всех и вывести инфу об...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru