2013-04-23 5 views
0

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

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

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

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

Мне нужно использовать все 4 класса в классе шаблона шаблона. Я написал дополнительный класс oaStringValueGetter, как показано ниже. Но есть проблема. Базовый класс oaValue ограничивает конструктор по умолчанию и copy-constructor. Существует только один способ создания экземпляров с помощью статического метода 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

Если класс ограничивает все его конструкторы, невозможно подклассифицировать его. Есть ли у 'oaValue' какие-либо публичные конструкторы? –

+0

Вы правы. Невозможно написать «class oaStringValueGetter: public oaStringValue» с заданными условиями. Я решил свою задачу по-другому. –

ответ

2

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

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

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

+0

Вы правы. В моем случае есть еще одно условие, о котором я не упоминал первоначально :). OaObject-производные классы создаются только каркасом. Они представляют собой объекты с сохранением целостности. Если я использую собственный класс, он не будет обрабатываться инфраструктурой. Таким образом, разнообразие решений здесь крайне ограничено. Наконец, я решил это, написав больше исходного кода. –

+0

@ Вадим Сухоруков. Хорошо, что вы это решили. Теперь опубликуйте ответ на этот вопрос и отметьте его как правильно, чтобы другие люди могли сразу увидеть, что ваш вопрос был, ну, ответил. :) – Casey

1

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

Смежные вопросы