Почему компилятор неявно удаляет конструктор при попытке инициализировать массив объектов в стиле C ++ 11 - PullRequest
3 голосов
/ 28 июня 2019

Я пытаюсь написать очень простой список инициализации конструктора, но не хватает массива объектов. Компилятор говорит:

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}
                      ^

ключевое слово «явное» предотвращает удаление конструктора, но на этот раз компилятор не принимает тип указателя, даже если они оба получены из одного и того же класса.

Следующее редактирование Примечание: Изменен список инициации субобъектов с двойными скобками.

1 Ответ

1 голос
/ 29 июня 2019

Я нашел объяснение в этой ссылке , о которой я уже подозревал.

Это выбор дизайна от разработчиков Qt.Они сделали класс QObject не подлежащим копированию по разным причинам, включая отсутствие путаницы с механизмом SIGNALS / SLOTS.

В качестве обходного пути я определю subObjects как массив указателей SubClass *, затем создам 3 экземплярас новым ключевым словом в конструкторе ParentClass.

PS: Oktalist, поэтому ваш код не выдает ошибку.QObject должен быть полностью определен как в рамках Qt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...