Я прочитал, что концепция сигнал / слот в qt должна всегда передавать аргументы по значению вместо ссылки, чтобы гарантировать, что сигналы / слоты работают безупречно между потоками.
Теперь у меня есть фрагмент кода, который будет компилироватьсякогда аргумент для сигнала передается по ссылке, а не по значению:
#include <QObject>
class mythirdclass {
public:
mythirdclass();
};
class mysecondclass : public QObject, public mythirdclass {
public:
mysecondclass(mythirdclass third);
};
class myclass : public QObject {
Q_OBJECT
public:
myclass();
signals:
// not working
void messageReceived(mysecondclass mymessage);
// working
// void messageReceived(mysecondclass &mymessage);
};
myclass::myclass()
{
mythirdclass third;
mysecondclass msg(third);
emit messageReceived(msg);
}
mysecondclass::mysecondclass(mythirdclass third)
{
// DO stuff
}
mythirdclass::mythirdclass()
{
}
Ошибка компилятора:
..\example\main.cpp: In constructor 'myclass::myclass()':
..\example\main.cpp:28:20: error: use of deleted function 'mysecondclass::mysecondclass(const mysecondclass&)'
emit signal(second);
^
..\example\main.cpp:8:7: note: 'mysecondclass::mysecondclass(const mysecondclass&)' is implicitly deleted because the default definition would be ill-formed:
class mysecondclass : QObject, public mythirdclass {
^
На основании ошибок, которые я думал о написании конструктора копирования для mysecondclass
, однако после некоторых попыток я отказался на данный момент, потому что я не понял это правильно.
Итак, мои вопросы:
- , почему компиляция завершается неудачно в первойplace?
- если произойдет сбой из-за отсутствующего конструктора копии, почему компилятор не может определить его неявно?
- как будет выглядеть конструктор рабочей копии в моем случае?
Заранее спасибо.