Как создать обертку для не-создаваемого класса?

Я работаю с конкретной библиотекой классов. Все доступные классы значений являются производными от базового класса. Есть скалярные типы

oaBooleanValue : public oaValue
oaIntValue     : public oaValue
oaFltValue     : public oaValue
oaStringValue  : public oaValue

Первые 3 класса определяют метод get () как возвращаемое значение. И 4-й класс определяет get как ссылку.

oaBoolean get() const;
oaInt     get() const;
oaFloat   get() const;
void      get(oaString& value) const;

Мне нужно использовать все 4 класса в моем классе-шаблоне.
Я написал вспомогательный класс oaStringValueGetter, как показано ниже. Но есть проблема. Базовый класс oaValue ограничивает конструктор по умолчанию и конструктор копирования. Существует только один способ создания экземпляров с помощью статического метода create ().

Есть ли способ добавить некоторые методы приведения типов в мой класс, чтобы он автоматически конвертировал из oaStringValue?

class oaStringValueGetter : public oaStringValue
{
public:
oaString get() const
{
oaString str;
oaStringValue::get(str);
return str;
}
};

А вот частичное определение класса, взятое из библиотеки, для справки

class oaObject {
public:
// public methods are here

protected:
~oaObject();

private:
oaObject();
oaObject(const oaObject& obj);

oaObject& operator=(const oaObject& obj);
};

class oaValue : public oaObject {
public:
void                    destroy();
oaBoolean               isEqual(oaValue *value) const;
oaValue                 *copy() const;
};

class oaString; // library-defined custom string class

class oaStringValue : public oaValue {
public:
static oaStringValue* create(oaObject* database, const oaString  &value);

void get(oaString& value) const;
void set(const oaString& value);
};

typedef int oaInt4;

class oaIntValue : public oaValue {
public:
static oaIntValue* create(oaObject* database, oaInt4 value);

oaInt4 get() const;
void set(oaInt4 value);
};

0

Решение

Я думаю, что вы путаете концепцию оболочки против подкласса.

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

В вашем случае наличие оболочек содержит экземпляры упакованных классов, а затем делегирование вызовов может быть проще.

2

Другие решения

Попробуйте создать шаблонную функцию для получения значения из объекта типа T, возвращая результат метода get () объекта. Это будет реализация по умолчанию для скаляров. Затем сделайте специализацию этого шаблона, где T = oaString и временная переменная oaString используются для получения строкового значения, как того требует ваш интерфейс. Вернуть эту переменную в результате. Надеюсь, это поможет вам

1