Я пытаюсь написать очень простой список инициализации конструктора, но не хватает массива объектов. Компилятор говорит:
parentclass.cpp:5: error: use of deleted function ‘SubClass::SubClass(SubClass&&)’
, subObjects{this}
^
Я уверен, что это основная концепция Modern C ++, и я видел много ответов на вопросы. Но никто из них не уточнил, чего мне не хватает.
Вот основной код, который создает эту ошибку компилятора (это g ++ 8.3.0)
Файл проекта QtCreator:
QT -= gui
CONFIG += c++11 console
CONFIG -= app_bundle
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
parentclass.cpp \
subclass.cpp
HEADERS += \
parentclass.h \
subclass.h
main.cpp:
#include <QCoreApplication>
#include "parentclass.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ParentClass pClass;
return a.exec();
}
parentclass.h:
#ifndef PARENTCLASS_H
#define PARENTCLASS_H
#include <QObject>
#include "subclass.h"
class ParentClass : public QObject
{
Q_OBJECT
public:
explicit ParentClass(QObject *parent = nullptr);
private:
SubClass subObjects[3];
};
#endif // PARENTCLASS_H
parentclass.cpp:
#include "parentclass.h"
ParentClass::ParentClass(QObject *parent)
: QObject(parent)
, subObjects{ {this} }
{
}
subclass.h:
#ifndef SUBCLASS_H
#define SUBCLASS_H
#include <QObject>
class SubClass : public QObject
{
Q_OBJECT
public:
SubClass(QObject *parent = nullptr);
};
#endif // SUBCLASS_H
subclass.cpp
#include "subclass.h"
SubClass::SubClass(QObject *parent)
: QObject(parent)
{
}
Создание динамического массива может быть обходным путем, но я пытаюсь адаптироваться к Modern C ++. Так как я в основном встраиваемый парень, динамические массивы также не обсуждаются много раз.
Заранее спасибо.
Редактировать Примечание:
Я обновил вопрос для минимального воспроизводимого примера.
Также, если я использую ключевое слово «явный» для конструктора подкласса, на этот раз он выдаст такую ошибку:
parentclass.cpp:5: error: could not convert ‘(ParentClass*)this’ from ‘ParentClass*’ to ‘SubClass’
, subObjects{this}
^
ключевое слово «явное» предотвращает удаление конструктора, но на этот раз компилятор не принимает тип указателя, даже если они оба получены из одного и того же класса.
Следующее редактирование Примечание:
Изменен список инициации субобъектов с двойными скобками.