2010-08-31 43 views
0

我有像下面的代码。 Base是基类,D1,D2,D3是派生类。 D1,D2和D3类对象可以分别保存int,float和double值。 我有一个基类指针向量。它们中的每一个都可以指向任何派生类对象。 通过基类指针,我应该能够获取任何派生类中的数据。如何通过基类指针提供一个函数来获取任何派生对象的数据?

enum Type 
{ 
    INT, 
    FLOAT, 
    DOUBLE 
}; 
struct Data 
{ 
    Type type; 
    union 
    { 
     int iVal; 
     float fVal; 
     double dVal; 
    }; 
}; 
class Base 
{ 
public: 
    virtual Data getData() = 0; 
}; 
class D1: public Base 
{ 
    int i; 
public: 
    virtual Data getData() 
    { 
     Data data; 
     data.type = INT; 
     data.iVal = i; 
     return data; 
    } 
}; 

class D2: public Base 
{ 
    float f; 
public: 
    virtual Data getData() 
    { 
     Data data; 
     data.type = FLOAT; 
     data.fVal = f; 
     return data; 
    } 
}; 

class D3: public Base 
{ 
    double d; 
public: 
    virtual Data getData() 
    { 
     Data data; 
     data.type = DOUBLE; 
     data.dVal = d; 
     return data; 
    } 
}; 

getData()返回数据对象。

使用在数据对象的类型,我需要提取工会对应的值。

我无法回避的类型,即使我使用虚拟函数机制检查。

有没有更好的方法通过单一接口函数返回数据?

编辑:在我的项目场景中,在运行时它可以生成很少的D1对象,很少的D2对象等等。我需要将所有这些对象传递给其他模块。 所以我用vector<Base *>将所有对象传递到下一个模块。 有没有更好的方法来传递所有的对象?

编辑:任何非升压解决方案存在?

+0

为什么你无法避免类型检查?一切都返回一个'Data',那么需要什么类型检查? – Naveen 2010-08-31 10:45:58

+0

@Naveen:我需要检查数据结构中存在的类型。例如:如果类型是INT,我会去访问data.iVal。 – bjskishore123 2010-08-31 10:48:44

+0

噢好吧..我以为你的意思是你需要检查派生类的类型。 – Naveen 2010-08-31 10:51:35

回答

3

一般而言,我宁愿避免这种设计。但是,如果你必须这样做,最简单和最快速的方法是使用boost::any

更新:由于使用的类型是已知的(感谢评论),因此,绝对正确地注意到boost::variant在这里可能更加方便和高效。

+0

+1:boost :: any/boost :: variant是解决此问题的最佳解决方案。 – Puppy 2010-08-31 10:54:49

+1

'boost :: variant'在这种情况下似乎更好,因为所有类型都是事先知道的。回想一下'boost :: any'使用堆和RAII。 – 2010-08-31 11:01:29

1

它看起来就像你正在试图做类似VARIANT结构的东西。你能解释一下更多关于你为什么尝试这种设计?

+0

@Ingram:你说得对。更新了我需要的问题。 – bjskishore123 2010-08-31 11:01:56

0

这可能是说得有点辛苦,但:面向对象和多态性是关于让对象做一些事情,这是不是从对象的查询数据。
如果这是关于打印,发送,存储...数据,您可以从数据派生并让派生的数据对象执行打印,发送,存储......,但在这种情况下,您不需要数据类:拥有类也可以这样做。

0

不是传递变种对象,有关它传递三个向量,每个只用一个什么类型的一个载体?

+0

由于对象的顺序也很重要,我需要将所有类型的对象放在一个向量中并逐个处理。例如:如果我在该矢量中有3个对象,我将创建3个相应的对象,可用于模块的下一个阶段。 – bjskishore123 2010-09-01 03:53:04

相关问题