2013-04-23 43 views
0

我正在使用特定的类库。所有可用的值类都是从基类派生的。有标量类型如何为非创建类创建包装?

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

前3个类定义方法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

如果一个类限制了它的所有构造函数,那么就不可能对它进行子类化。 'oaValue'是否有任何公共构造函数? – 2013-04-23 17:43:21

+0

你说得对。用给定的条件编写“class oaStringValueGetter:public oaStringValue”是不可能的。我以不同的方式解决了我的任务。 – 2013-05-23 10:32:50

回答

2

我想你混淆了一个包装VS子类的概念,部分类定义。

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

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

+0

你说得对。在我的情况下,还有一个条件我最初没有提到:) oaObject派生类仅由框架创建。他们是混乱的对象。如果我将自己的课程分类,则不会由框架处理。所以,这里的各种解决方案非常有限。最后我通过编写更多的源代码来解决它。 – 2013-05-23 10:46:23

+0

@VadimSukhorukov这很好,你解决了它。现在发布一个答案,并将其标记为正确,以便其他人可以一目了然地看到您的问题已得到回答。 :) – Casey 2013-05-23 16:27:19

1

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