Базовый класс и производные классы в QtC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Базовый класс и производные классы в Qt

Сообщение Anonymous »

Я создаю оболочку Qt для RtMidi. В качестве отправной точки я создал два отдельных класса QMidiOut и QMidiIn, которые обертывают RtMidiOut и RtMidiIn.
Я не хочу дублировать код для общих методов (например, openPort, closePort и т. д.), поэтому я планирую вывести QMidiOut и QMidiIn из базового класса () со всеми распространенными методами (RtMidi).
Я не могу использовать классы шаблонов (

Код: Выделить всё

Q_OBJECT
этого не позволяет), и я не могу создать объект RtMidi в базовом классе, поскольку его деструктор защищен.
Класс QMidiIn:

Код: Выделить всё

#ifndef QMIDIIN_H
#define QMIDIIN_H

#include 
#include "QMidi.h"

class QMidiIn : public QMidi
{
Q_OBJECT

public:
explicit QMidiIn(QObject *parent = nullptr);
~QMidiIn();

private:
RtMidiIn* rtMidiIn = nullptr;

static void callback( double deltatime, std::vector< unsigned char > *message, void *userData );
};

#endif // QMIDIIN_H
Класс QMidiOut:

Код: Выделить всё

#ifndef QMIDIOUT_H
#define QMIDIOUT_H

#include 
#include "QMidi.h"

class QMidiOut : public QMidi
{
Q_OBJECT

public:
explicit QMidiOut(QObject *parent = nullptr);
~QMidiOut();

private:
RtMidiOut* rtMidiOut = nullptr;
};

#endif // QMIDIOUT_H
Базовый класс QMidi

Код: Выделить всё

#ifndef QMIDI_H
#define QMIDI_H

#include 
#include "RtMidi.h"

class QMidi : public QObject
{
Q_OBJECT

public:
explicit QMidi(QObject *parent = nullptr) : QObject(parent) {};

void openPort( unsigned int portNumber = 0, const QString &portName = "RtMidi" ); // common methods
void closePort(); // common methods

protected:
RtMidi* rtMidi = nullptr;
};
Мое решение — создать объекты в производных классах, а затем назначить указатель базового класса:
Конструктор QMidiOut:

Код: Выделить всё

rtMidiOut = new RtMidiOut();
rtMidi = static_cast(rtMidiOut);
Конструктор QMidIn:

Код: Выделить всё

rtMidiIn = new RtMidiIn();
rtMidi = static_cast(RtMidiIn);
Есть ли лучший способ добиться этого? Цель — написать все распространенные методы в базовом классе.

Подробнее здесь: https://stackoverflow.com/questions/798 ... sses-in-qt
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»