Есть несколько классов 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() недоступен
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости