首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用static_cast的类型转换无效,我应该使用什么正确的类型转换?

使用static_cast的类型转换无效,我应该使用什么正确的类型转换?
EN

Stack Overflow用户
提问于 2013-01-30 20:03:10
回答 3查看 23.5K关注 0票数 1

我有一个typedef vector<Object*> ObjList;的类型定义,我还有一个vector<BigObject*>* ObjectBox::getBigObjectList();函数。BigObject是从Object继承的

我想要做的是从getBigObjectList()获取一个vector<BigObject*>*,并将其转换为vector<Object*>*,这是一个向上转换的类型,该类型被定义为ObjList,所以我基本上想将其转换为ObjList类型

我试过两种方法,第一种是

代码语言:javascript
复制
ObjList *normalObjectList = (ObjList*) box->getBigObjectList();

我从这篇文章(When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?)中读到,C风格的类型转换很少被需要,因为它可以被开发成一个reinterpret-cast

然后我尝试使用static_cast,但是我得到了一个错误,说类型转换无效

代码语言:javascript
复制
ObjList *normalObjectList = static_cast<ObjList*> (box->ClipObjectInRect());

这也行不通。

代码语言:javascript
复制
ObjList *normalObjectList = static_cast<vector<Object*>*> (box->ClipObjectInRect());

为什么这不起作用?这是不是因为static_cast只能用于转换直接类(如Object本身),而不是嵌套类(我在这里完全是猜测)?在这种情况下我应该怎么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-30 20:33:45

你的推理有一个非常常见的缺陷,我想我们都在某些时候犯了同样的错误。您认为std::vector<>只是一个输出容器,因为这是您现在想要使用它的方式,但事实并非如此。

想象一下,下面的代码将被编译:

代码语言:javascript
复制
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语言的行为,它会导致运行时错误:)

票数 3
EN

Stack Overflow用户

发布于 2013-08-27 23:24:10

如果编译器不知道(或假装不知道)类型之间的关系,静态转换也会失败。如果您的继承没有在两者之间声明为公共类型( public ),则编译器会将它们视为不相关的类型,并给出相同的隐式警告。

这伤了我的心,所以我想和你分享一下。

票数 15
EN

Stack Overflow用户

发布于 2013-01-30 20:13:41

我可能错了,但我认为您可能需要在向量中对每个单独的对象进行强制转换。我会尝试重载getBigObjectList()来返回一个ObjList*。因此,您的重载函数将如下所示

代码语言:javascript
复制
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所说的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14603546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档