如何为不可创建类创建包装器

How to create a wrapper for non-creatable class?

本文关键字:创建 包装      更新时间:2023-10-16

我正在使用特定的类库。所有可用的值类都是从基类派生的。有标量类型

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

前3个类定义方法get()作为返回值。第四个类将get定义为获取引用。

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

我需要在我的模板包装器类中统一使用所有4个类。我已经编写了辅助oaStringValueGetter类,如下所示。但问题是存在的。基类ovalue限制了默认构造函数和复制构造函数。只有一种方法可以创建实例,即使用静态的'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);
};

我想你混淆了包装器和子类的概念。

包装器不一定是被包含类的子类,它可以由被包含类的实例组成,其中对组合类的调用被委托给被组合类,而不是直接继承。

在您的情况下,让包装器包含包装类的实例,然后委托调用可能更容易。

尝试创建一个模板函数,通过返回对象的get()方法的结果来从类型为T的对象获取值。它将是标量的默认实现。然后对这个模板进行专门化,其中使用T=oaString和临时oaString变量来获取接口所需的字符串值。返回该变量作为结果。希望对大家有所帮助