@ilyamisyura

Как избежать ошибки при использовании объектов класса, наследованного от 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 <QObject>
#include <QVector>

class DataSignal : public QObject
{
    Q_OBJECT
public:
    explicit DataSignal(QObject *parent = 0);
    QVector <double> getData();
    QVector <double> getTimeScale();

private:
    QVector <double> data;
    QVector <double> timeScale;

signals:
    void dataChanged(QVector <double> data);
    void timeScaleChanged(QVector <double> data);
    void cleared();

public slots:
    void setData(QVector <double> data);
    void setTimeScale(QVector <double> timeScale);
    void clear();

};

#endif // DATASIGNAL_H


В свою очередь, наш генератор наследуется от абстрактного класса
#include <QObject>
#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;
}


Помогите, люди добрые!
  • Вопрос задан
  • 5601 просмотр
Решения вопроса 1
Vinatorul
@Vinatorul
Developer
У QObject конструкторы копирования и операторы присваивания заблокированы: Объектная модель Qt
Нет конструктора копирования или оператора присваивания

Дело в том, что здесь
DataSignal DiscreteGenerator::generateSimpleSignal(/*some params*/){
    DataSignal signal;
    /*something happens*/
    return signal;
}

Вы сначала создаёте объект DataSignal, а затем возвращаете его копию.

Попробуйте переделать на указатель:
DataSignal* DiscreteGenerator::generateSimpleSignal(/*some params*/){
    DataSignal *signal = new DataSignal;
    /*something happens*/
    return signal;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@me76
программист на C++
Можно также явно определить конструктор копирования DataSignal, не вызывающий копирование QObject - это даст возможность создавать объекты в стеке. Но обратите внимание, что такой объект должен создаваться без владельца (параметр QObject *parent в конструкторе DataSignal), т. к. владелец считает, что дочерний объект находится в куче и пытается удалить его в своём деструкторе.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы