我的程序目前使用类型转换为空指针向量,根据以下内容:
(注意代码是“主要”,我删除了大部分不必要的内容。
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();
}
如果可能的话,这将为我节省大量代码。
答案 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[]
似乎是一个数组(或vector
个int
。您可能希望将其更改为公共基础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();
}