0

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

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);
};
4

2 回答 2

2

我认为您混淆了包装器与子类的概念。

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

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

于 2013-04-23T17:57:35.473 回答
1

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

于 2013-04-24T09:14:18.667 回答