Есть несколько классов DriverProperty_p
— прототип свойств драйвера, DriverProperty<T>
— свойство доступное для чтения-записи. DriverPropertyReadOnly< T >
и DriverPropertyWriteOnly< T >
— свойства доступные только для чтения или записи. В качестве буфера данных использую QByteArray
. В прототипе реализованы все необходимые функции отправки и получения данных в/из устройства. Есть следующий код (привожу только header):
class DriverProperty_p
{
public:
DriverProperty_p(AbstractDriver * parent, QString name, quint8 cmdGetter, quint8 cmdSetter = 0xFF);
QByteArray getValue();
void setValue(QByteArray value);
QString getName() const;
void setName(const QString &name);
quint8 getCmdGetter() const;
void setCmdGetter(const quint8 &cmdGetter);
quint8 getCmdSetter() const;
void setCmdSetter(const quint8 &cmdSetter);
private:
AbstractDriver *mDriver;
QString mName;
QByteArray mValue;
quint8 mCmdGetter;
quint8 mCmdSetter;
};
template <typename T>
class DriverProperty: public DriverProperty_p
{
using DriverProperty_p::setValue;
using DriverProperty_p::getValue;
public:
DriverProperty(AbstractDriver * parent, QString name, quint8 cmdGetter, quint8 cmdSetter = 0xFF)
: DriverProperty_p(parent, name, cmdGetter, cmdSetter)
{}
static T convertFromByteArray(const QByteArray &ba);
static QByteArray convertToByteArray(const T & data);
T getValue()
{
return convertFromByteArray(DriverProperty_p::getValue();
}
void setValue(T value)
{
DriverProperty_p::setValue(convertToByteArray(value));
}
};
template <typename T>
class DriverPropertyReadOnly: public DriverProperty<T>
{
using DriverProperty<T>::setValue;
public:
DriverPropertyReadOnly(AbstractDriver * parent, QString name, quint8 cmdGetter)
: DriverProperty<T>(parent, name, cmdGetter)
{}
};
template <typename T>
class DriverPropertyWriteOnly: public DriverProperty<T>
{
using DriverProperty<T>::getValue;
public:
DriverPropertyWriteOnly(AbstractDriver * parent, QString name, quint8 cmdGetter)
: DriverProperty<T>(parent, name, cmdGetter)
{}
};
При попытке компиляции кода выдает ошибку о том, что недоступен DriverProperty_p::setValue
.
Вообще цель подобного кода заключалась в том, чтобы реализовать все функции в классе общего назначения (DriverProperty< T >
) (и он работает как надо), а затем скрыть для использования соответствующие методы у потомков. Ну и основной мой вопрос: как правильно скрывать методы в потомках класса.
Возможно Вы имеете ввиду это?
#include <iostream>
#define PURE_VIRTUAL =0
using std::cout;
using std::endl;
using std::cin;
class AbstractDriver
{
public:
virtual void A() PURE_VIRTUAL;
virtual void B() PURE_VIRTUAL;
};
class Driver_1 : public AbstractDriver
{
public:
virtual void A() override { cout << "A" << endl; }
virtual void B() override { cout << "B" << endl; }
};
class Driver_1_1 : protected Driver_1
{
public:
void A() override { Driver_1::A(); };
};
int main()
{
Driver_1 a;
Driver_1_1 b;
a.A(); a.B();
b.A(); b.B();
cin.get();
return 0;
}
Код не скомпилируется потому что b.B()
недоступен
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
У меня есть простая таблица, где каждое поле word привязано к значению id (auto increment) из другой таблицы
Можно ли использовать cameraX в background services? Нашёл пример с camera2 api, но не нашёл ничего подобного для cameraX
Скажите пожалуйста, возможно ли сделать так: Положить jre в отдельную папку, в launch4j указать путь к этой папке и чтобы при запуске exe-файла jre бралась...