我有一个typedef vector<Object*> ObjList;的类型定义,我还有一个vector<BigObject*>* ObjectBox::getBigObjectList();函数。BigObject是从Object继承的
我想要做的是从getBigObjectList()获取一个vector<BigObject*>*,并将其转换为vector<Object*>*,这是一个向上转换的类型,该类型被定义为ObjList,所以我基本上想将其转换为ObjList类型
我试过两种方法,第一种是
ObjList *normalObjectList = (ObjList*) box->getBigObjectList();我从这篇文章(When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?)中读到,C风格的类型转换很少被需要,因为它可以被开发成一个reinterpret-cast
然后我尝试使用static_cast,但是我得到了一个错误,说类型转换无效
ObjList *normalObjectList = static_cast<ObjList*> (box->ClipObjectInRect());这也行不通。
ObjList *normalObjectList = static_cast<vector<Object*>*> (box->ClipObjectInRect());为什么这不起作用?这是不是因为static_cast只能用于转换直接类(如Object本身),而不是嵌套类(我在这里完全是猜测)?在这种情况下我应该怎么做?
发布于 2013-01-30 20:33:45
你的推理有一个非常常见的缺陷,我想我们都在某些时候犯了同样的错误。您认为std::vector<>只是一个输出容器,因为这是您现在想要使用它的方式,但事实并非如此。
想象一下,下面的代码将被编译:
vector<BigObject*>* bigVector = box->ClipObjectInRect(); // OK
ObjList* objVector = static_cast<ObjList*>(bigVector); // Not OK; we'll now see why
objVector->push_back(new SmallObject()); // OUCH正如您所看到的,允许这种类型转换将允许您尝试将SmallObject*放入只能包含BigObject*的内容中。这肯定会导致运行时错误。
顺便说一句:你实际上可以在相关类型的数组之间进行转换。这是一个继承自C语言的行为,它会导致运行时错误:)
发布于 2013-08-27 23:24:10
如果编译器不知道(或假装不知道)类型之间的关系,静态转换也会失败。如果您的继承没有在两者之间声明为公共类型( public ),则编译器会将它们视为不相关的类型,并给出相同的隐式警告。
这伤了我的心,所以我想和你分享一下。
发布于 2013-01-30 20:13:41
我可能错了,但我认为您可能需要在向量中对每个单独的对象进行强制转换。我会尝试重载getBigObjectList()来返回一个ObjList*。因此,您的重载函数将如下所示
ObjList* ObjectBox::getBigObjectList()
{
vector<Object*> return_vec
for(vector<BigObject*>::iterator itr = ObjectBox.bigObjectList.begin(); itr != ObjectBox.bigObjectList.end(); itr++)
{
return_vec.push_back(static_cast<Object*> (itr));
}
return return_vec
}您将向量描述为列表有什么特别的原因吗?或者首先使用向量而不是列表?
编辑:基本上,Denis所说的。
https://stackoverflow.com/questions/14603546
复制相似问题