Тема: Qt Проблема множинного успадкування

В мене є клас currency_operation (валютні операції)
і дві форми + класи -  "currency" та "new_currency", вони мають брати інформацію (використовувати методи та поля) з currency_operation

Але тут проблема якщо не вставити в клас currency_operation макрос Q_OBJECT

Помилка якщо не вставляти Q_OBJECT

error: 'staticMetaObject' is not a member of 'currency_operation'
     { &currency_operation::staticMetaObject, qt_meta_stringdata_currency.data,
        ^

то успадкування не можливе, (або я не знаю як так зробити) а щоб вставати в клас Q_OBJECT потрібно currency_operation успадкуватися від QObject, клас currency успадковується від QMainWindow який в свою чергу успадковується від QObject але й клас new_currency успадковується від QWidget що породжує проблему я не можу написати currency_operation : QMainWindow тим самим уникнути множинного успадкування і його проблем, тому я зробив так



currency_operation

class currency_operation : public QObject
{
    Q_OBJECT
...
}

currency

class currency : public currency_operation, public QMainWindow
{
    Q_OBJECT
...
}

new_currency

class new_currency : public currency_operation, public QWidget
{
    Q_OBJECT
...
}

Зрозуміло що в мене виходить проблема бо QMainWindow і QWidget вже має QObject
Я ще пробував віртуальне успадкування, але й теж помилка

class currency_operation : public virtual QObject
{
    Q_OBJECT
...
}

error: 'QObject' is an ambiguous base of 'currency'
         currency *_t = static_cast<currency *>(_o);
                                                  ^

Як можна уникнути помилки "ромба" (якщо ця помилка по іншому називається о виправте мене) ?

2

Re: Qt Проблема множинного успадкування

Якщо ви хочете отримати на C++ ООП, а не АТД, вам треба всюди, де можна, дописувати virtual.
class currency_operation : public virutal QObject
class currency : public virtual currency_operation, public virtual QMainWindow
і т.д.
У вас currency_operation віртуально успадковує QObject, а от його нащадки - невіртуально включають в себе currency_operation, відповідно, утворюється ромб.
Хоча ще є варіант точно вказувати, до якого саме з предків ви кастуєте свій об'єкт.
А ще є питання з коректністю архітектури, якщо треба використовувати cast-и, але це може бути і вимога архітектури Qt.

Подякували: Betterthanyou, leofun012

3

Re: Qt Проблема множинного успадкування

koala написав:

... вам треба всюди, де можна, дописувати virtual.
class currency_operation : public virutal QObject
class currency : public virtual currency_operation, public virtual QMainWindow
і т.д.

На-жаль не допомогло та ж помилка, а в додаток нові появилися від QMainWindow

koala написав:

Хоча ще є варіант точно вказувати, до якого саме з предків ви кастуєте свій об'єкт.

Це ще попробую, бо я не зав що так можна

Але проблемну вирішено, я на початку писав що без макрос Q_OBJECT виникає помилка, виявляється це із за неправильної послідовності успадкування
так правильно

class currency :  public QMainWindow, public currency_operation

а так ні

class currency :  public currency_operation, public QMainWindow

я навіть не підозрював що це різні речі

4

Re: Qt Проблема множинного успадкування

Взагалі мені важко собі уявити, що то за "операція з валютою", що є одночасно "основним вікном додатку".

Подякували: leofun011

5

Re: Qt Проблема множинного успадкування

Гм... за документацією таке взагалі неможливо. Qt такий Qt.

Якщо ви використовуєте множинне наслідування, moc приймає, що перший наслідуваний клас - підклас QObject. Також переконайтеся що тільки перший наслідований клас - QObject. Віртуальне наслідівання QObject-ів не підтримується.

оригінал

If you are using multiple inheritance, moc assumes that the first inherited class is a subclass of QObject. Also, be sure that only the first inherited class is a QObject.
Virtual inheritance with QObject is not supported.

Подякували: Betterthanyou, leofun012

6 Востаннє редагувалося Betterthanyou (04.06.2016 16:34:00)

Re: Qt Проблема множинного успадкування

koala написав:

Взагалі мені важко собі уявити, що то за "операція з валютою", що є одночасно "основним вікном додатку".

Це не основне вікно ... довго розповідати про програму, але вона пов'язана з торгівлею і потрібно додати можливість вибирати валюту
Вікно валюта потрібне для додавання валюти(точніше кнопки) перегляду і редагування, а
Нова валюта для додавання нової валюти
currency_operation - це просто клас який буде займатися різними операціями пов'язаними з валютами, дані я беру з національного банку України в нього є API

скрін

На курс не дивіться це ще не робоча версія
http://s8.сайт-злодій/uploads/images/2016/06/1c9786fe2f50f1f1c564cd35ee17faf0.png

7

Re: Qt Проблема множинного успадкування

Почитайте щось про моделі в Qt. Воно дуже корисно буде.