Как избежать ошибки при использовании объектов класса, наследованного от QObject? Есть класс DataSignal, который я наследую от QObject, также есть класс Generator, который использует объекты этого класса, т.е. есть у генератора метод, который должен возвращать объект класса DataSignal. Но при компиляции выдается следующая ошибка: - call to implicitly-deleted copy constructor of 'DataSignal'
- copy constructor of 'DataSignal' is implicitly deleted because base class 'QObject' has a deleted copy constructor
Класс сигналов#ifndef DATASIGNAL_H
#define DATASIGNAL_H
#include
#include
class DataSignal : public QObject
{
Q_OBJECT
public:
explicit DataSignal(QObject *parent = 0);
QVector getData();
QVector getTimeScale();
private:
QVector data;
QVector timeScale;
signals:
void dataChanged(QVector data);
void timeScaleChanged(QVector data);
void cleared();
public slots:
void setData(QVector data);
void setTimeScale(QVector timeScale);
void clear();
};
#endif // DATASIGNAL_H
В свою очередь, наш генератор наследуется от абстрактного класса#include
#include "datasignal.h"
class AbstractGenerator : public QObject
{
Q_OBJECT
public:
explicit AbstractGenerator(QObject *parent = 0);
signals:
void signalIsGenerated(DataSignal *signal);
public slots:
};
Сам класс генератора#include "abstractgenerator.h"
#include "filtercore.h"
class DiscreteGenerator : public AbstractGenerator
{
public:
DiscreteGenerator();
public slots:
DataSignal generateSimpleSignal(/*some params*/);
};
А здесь, в *.cpp файле, возникает ошибка:DataSignal DiscreteGenerator::generateSimpleSignal(/*some params*/){
DataSignal signal;
/*something happens*/
return signal;
}
Помогите, люди добрые!

21 Авг 2019 в 07:08
200 +1
0
Ответы
1

Проблема здесь заключается в том, что класс QObject, от которого наследуется класс DataSignal, имеет удаленный конструктор копирования. Это означает, что объекты класса QObject не могут быть скопированы или возвращены по значению.

Чтобы избежать этой ошибки, вам нужно вернуть указатель или ссылку на объект DataSignal, а не сам объект. В вашем классе DiscreteGenerator измените метод generateSimpleSignal следующим образом:

DataSignal *DiscreteGenerator::generateSimpleSignal(/*some params*/) {
DataSignal *signal = new DataSignal();
/*something happens*/
return signal;
}

Или, если вы хотите использовать ссылку вместо указателя:

DataSignal &DiscreteGenerator::generateSimpleSignal(/*some params*/) {
static DataSignal signal;
/*something happens*/
return signal;
}

Таким образом, вы избежите ошибки implicit-deleted copy constructor и сможете вернуть объект DataSignal из метода генератора. Не забудьте освободить память, если вы используете указатель!

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир