我的类型定义为typedef vector<Object*> ObjList;
我还有一个函数vector<BigObject*>* ObjectBox::getBigObjectList();
。来自BigObject
Object
已被隐含
我想要做的是从vector<BigObject*>*
获取getBigObjectList()
并将其转换为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
本身)而不是嵌套类(我只是在这里猜测)?在这种情况下我该怎么做?
答案 0 :(得分:12)
如果编译器不知道(或假装不知道)类型之间的关系,静态强制转换也会失败。如果您的继承未在两者之间声明为 public ,则编译器会将它们视为不相关的类型,并为您提供相同的神秘警告。
这只是咬我,所以我想分享。
答案 1 :(得分:3)
你的推理有一个非常常见的缺陷;我想我们都曾犯过同样的错误。您认为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继承的行为。它会导致运行时错误:)
答案 2 :(得分:1)
我可能错了,但我认为您可能需要在向量中投射每个单独的对象。我会尝试重载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
}
您将矢量描述为列表的任何特殊原因?或者首先使用向量而不是列表?
编辑:基本上,丹尼斯说的是什么。