Russian Qt Forum
Ноябрь 25, 2024, 03:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка с декларированием собственного класса  (Прочитано 3375 раз)
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« : Октябрь 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   

Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Октябрь 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, или в приватной части находится.
Если хотите подробностей, приведите больше кода.
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #2 : Октябрь 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.
Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #3 : Октябрь 14, 2022, 13:47 »

Нет, проблема естественно была не с точкой запятой, почему то для декларирования типа требуется метод:

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

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

Сообщений: 339


Просмотр профиля
« Ответ #4 : Октябрь 14, 2022, 16:15 »

кто-то может знает зачем этот метод при декларировании?

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

Q_DECLARE_METATYPE
Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #5 : Октябрь 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)
заметь , тут этой функции нет и все работает и декларируется, но я работаю с легаси кодом, там внутри класса много различных операторов переопределенных и конструкторов, вот я и спрашиваю,что именно может повлиять на ОБЯЗАТЕЛЬНОЕ наличие этого конструктора, получается если что-то(что конкретно я не знаю) определено внутри класса,тогда и этот конструктор должен быть ОБЯЗАТЕЛЬНО для декларирования,обычный код с конструктором и деструктором декларируется без конструктора копирования
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #6 : Октябрь 17, 2022, 15:35 »

тут этой функции нет и все работает и декларируется
Обычно конструктор копирование есть по умолчанию.


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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Октябрь 17, 2022, 15:56 »

например, конструктор копирования может быть непубличным или удаленным, тогда Q_DECLARE_METATYPE использовать не получится

полное отсутствие конструктора копирования в классе идентично записи
Код
C++ (Qt)
MyClass(const MyClass & other) = default;
« Последнее редактирование: Октябрь 17, 2022, 15:58 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Октябрь 17, 2022, 16:44 »

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

Наверное имелось ввиду?
Код
C++ (Qt)
MyClass(const MyClass & other) = delete;
 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Октябрь 17, 2022, 18:20 »

нет, я имел в виду конструктор копирования по умолчанию Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Октябрь 17, 2022, 18:34 »

нет, я имел в виду конструктор копирования по умолчанию Улыбающийся
Тогда не понятно почему "полное отсутствие" идентично этой записи. Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Октябрь 17, 2022, 19:52 »

если не написать конструктор копирования самому («полное отсутствие» Улыбающийся ), компилятор его сам создаст в виде почленного копирования
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.117 секунд. Запросов: 22.