类型/类的向量用于类型化空指针

时间:2011-09-21 12:22:13

标签: c++ casting vector

我的程序目前使用类型转换为空指针向量,根据以下内容:

(注意代码是“主要”,我删除了大部分不必要的内容。

for (i=0;i<NObjects;i++)
{
    switch (ObjectTypes[i])
    {
    case 1:
        ((File_GUI*) (NullVector[i]))->function();
        break;

    case 2:
        ((Point_GUI*) (NullVector[i]))->function();
        break;

    case 3....etc
    }
}

有没有办法用一个用于类型转换的简单数组替换大量的case 1,case 2等?因此代码看起来像这样(当然,必须先创建TypeCastVector,并为每个索引包含数据类型:

for (i=0;i<NObjects;i++)
{
    ((typeCastVector[i]*) (NullVector[i]))->function();
 }

如果可能的话,这将为我节省大量代码。

2 个答案:

答案 0 :(得分:1)

我同意Kerrek SB,可能需要进行重新设计,以便为此目的使用虚函数调用和基类。如果由于某种原因你真的不想给File_GUI,Point_GUI等基类,你可以这样做......

struct BaseStorer
{
    virtual void CallFunction() = 0;
};

template<typename T>
struct TypeStorer : public BaseStorer
{
    TypeStorer(T* _obj) : obj(_obj) {}
    virtual void CallFunction() { obj->function(); }

    T* obj;
};

存储new TypeStorer<File_GUI>(new File_GUI(...))的BaseStorer *数组。你的循环看起来像......

for (i=0;i<NObjects;i++)
{
    baseStorerVector[i]->CallFunction();
}

答案 1 :(得分:0)

我的意见与评论中提到的相同。目前,您的ObjectTypes[]似乎是一个数组(或vectorint。您可能希望将其更改为公共基础class的指针(句柄)数组。例如,

GUI *ObjectTypes[NObjects];

class层次结构在哪里,

class GUI {  // abstract base class
public:
  virtual void function () = 0; // make it an abstract method
};

class File_GUI : public GUI {
  void function () { ... }
};
...

现在,您可以将您的通话替换为一行

for (i=0;i<NObjects;i++)
{
    ObjectTypes[i]->function();
}