用于类型转换空指针的类型/类的向量

vector of type/class for typecasting null pointer

本文关键字:向量 类型 空指针 用于 类型转换      更新时间:2023-10-16

我有一个程序,目前使用类型转换为一个空指针向量根据以下:

(注意代码是"principal",我去掉了大部分不必要的内容。

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等?因此,代码看起来像这样(当然,typeecastvector必须更早创建,并包含每个索引的数据类型i:

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

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

我同意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;
};

存储一个数组的basestover *是new TypeStorer<File_GUI>(new File_GUI(...))。你的循环看起来像…

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

我的观点与评论中提到的相同。目前,您的ObjectTypes[]似乎是一个数组(或int s的vector)。您可能想将其更改为一个公共基础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();
}