Russian Qt Forum

Qt => Вопросы новичков => Тема начата: opera от Октябрь 13, 2022, 18:24



Название: Ошибка с декларированием собственного класса
Отправлено: opera от Октябрь 13, 2022, 18:24
Всем привет, не могу понять в чем ошибка с  Q_DECLARE_METATYPE:
Код:
namespace MyNamespace {
class MyClass : public AbstractMyClass
{
 
}
}
Q_DECLARE_METATYPE(MyNamespace::MyClass)

получаю такую ошибку,что не так?
Severity   Code   Description   Project   File   Line   Suppression State
Error   C2280   'MyNamespace::MyClass::MyClass(const MyNamespace::MyClass&)': attempting to reference a deleted function   BksMtRisk   C:\qt2\5.15.2\msvc2019_64\include\QtCore\qmetatype.h   825   



Название: Re: Ошибка с декларированием собственного класса
Отправлено: Johnik от Октябрь 13, 2022, 19:14
получаю такую ошибку,что не так?
Severity   Code   Description   Project   File   Line   Suppression State
Error   C2280   'MyNamespace::MyClass::MyClass(const MyNamespace::MyClass&)': attempting to reference a deleted function   BksMtRisk   C:\qt2\5.15.2\msvc2019_64\include\QtCore\qmetatype.h   825   

Компилятор не может найти функцию BksMtRisk.
Вероятно она описана в h-файле и отсутствует в cpp, или в приватной части находится.
Если хотите подробностей, приведите больше кода.


Название: Re: Ошибка с декларированием собственного класса
Отправлено: ssoft от Октябрь 14, 2022, 09:08
Код
C++ (Qt)
namespace MyNamespace {
class MyClass : public AbstractMyClass
{
 
}; //!!!
}
Q_DECLARE_METATYPE(MyNamespace::MyClass)
 

1) Нет точки с запятой
2) Класс похоже абстрактный
Цитировать
This macro makes the type Type known to QMetaType as long as it provides a public default constructor, a public copy constructor and a public destructor.


Название: Re: Ошибка с декларированием собственного класса
Отправлено: opera от Октябрь 14, 2022, 13:47
Нет, проблема естественно была не с точкой запятой, почему то для декларирования типа требуется метод:

Код:
MyClass (const MyClass & other){}

добавляю его и все нормально,убираю его и ошибка,кто-то может знает зачем этот метод при декларировании?


Название: Re: Ошибка с декларированием собственного класса
Отправлено: Johnik от Октябрь 14, 2022, 16:15
кто-то может знает зачем этот метод при декларировании?

Чтоб с кастомным классом мог работать QVariant

Q_DECLARE_METATYPE (https://doc.qt.io/qt-5/qmetatype.html#Q_DECLARE_METATYPE)


Название: Re: Ошибка с декларированием собственного класса
Отправлено: opera от Октябрь 14, 2022, 18:02
Цитировать
Чтоб с кастомным классом мог работать QVarian
не все так однозначно, если написать просто вот так:
Код:
class BaseMyClass
{
public:
    BaseMyClass(){};
    virtual ~BaseMyClass(){};
    virtual int getID() = 0;
private:
    int id = 0;
};

class MyClass : public BaseMyClass
{
public:
    MyClass() = default;


    virtual ~MyClass() = default;
    void setValue(int newValue)
    {
        std::thread::id h = std::this_thread::get_id();
        value = newValue;
    }
    int getID() {return 1;}
private:
    int value = 0;
};
Q_DECLARE_METATYPE(MyClass)
заметь , тут этой функции нет и все работает и декларируется, но я работаю с легаси кодом, там внутри класса много различных операторов переопределенных и конструкторов, вот я и спрашиваю,что именно может повлиять на ОБЯЗАТЕЛЬНОЕ наличие этого конструктора, получается если что-то(что конкретно я не знаю) определено внутри класса,тогда и этот конструктор должен быть ОБЯЗАТЕЛЬНО для декларирования,обычный код с конструктором и деструктором декларируется без конструктора копирования


Название: Re: Ошибка с декларированием собственного класса
Отправлено: Johnik от Октябрь 17, 2022, 15:35
тут этой функции нет и все работает и декларируется
Обычно конструктор копирование есть по умолчанию.


что именно может повлиять на ОБЯЗАТЕЛЬНОЕ наличие этого конструктора, получается если что-то(что конкретно я не знаю) определено внутри класса,тогда и этот конструктор должен быть ОБЯЗАТЕЛЬНО для декларирования,обычный код с конструктором и деструктором декларируется без конструктора копирования
Приведите декларацию вашего класса.


Название: Re: Ошибка с декларированием собственного класса
Отправлено: kambala от Октябрь 17, 2022, 15:56
например, конструктор копирования может быть непубличным или удаленным, тогда Q_DECLARE_METATYPE использовать не получится

полное отсутствие конструктора копирования в классе идентично записи
Код
C++ (Qt)
MyClass(const MyClass & other) = default;


Название: Re: Ошибка с декларированием собственного класса
Отправлено: Old от Октябрь 17, 2022, 16:44
полное отсутствие конструктора копирования в классе идентично записи
Код
C++ (Qt)
MyClass(const MyClass & other) = default;

Наверное имелось ввиду?
Код
C++ (Qt)
MyClass(const MyClass & other) = delete;
 


Название: Re: Ошибка с декларированием собственного класса
Отправлено: kambala от Октябрь 17, 2022, 18:20
нет, я имел в виду конструктор копирования по умолчанию :)


Название: Re: Ошибка с декларированием собственного класса
Отправлено: Old от Октябрь 17, 2022, 18:34
нет, я имел в виду конструктор копирования по умолчанию :)
Тогда не понятно почему "полное отсутствие" идентично этой записи. :)


Название: Re: Ошибка с декларированием собственного класса
Отправлено: kambala от Октябрь 17, 2022, 19:52
если не написать конструктор копирования самому («полное отсутствие» :) ), компилятор его сам создаст в виде почленного копирования