Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用静态强制转换的类型转换无效,我应该使用什么正确的强制转换?_C++_Casting_Typedef_Static Cast - Fatal编程技术网

C++ 使用静态强制转换的类型转换无效,我应该使用什么正确的强制转换?

C++ 使用静态强制转换的类型转换无效,我应该使用什么正确的强制转换?,c++,casting,typedef,static-cast,C++,Casting,Typedef,Static Cast,我有一个typedef向量对象列表的类型定义我还有一个函数vector*ObjectBox::getBigObjectList()大对象是从对象 我想做的是从getBigObjectList()中获取一个vector*,并将其转换为vector*,这是一个向上转换的类型,该类型被定义为ObjList,所以我基本上想将其转换为ObjList类型 我试过两种方法,第一种是 ObjList *normalObjectList = (ObjList*) box->getBigObjectList(

我有一个
typedef向量对象列表的类型定义我还有一个函数
vector*ObjectBox::getBigObjectList()<代码>大对象
是从
对象

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

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

ObjList *normalObjectList = (ObjList*) box->getBigObjectList();
我从这篇文章()中读到了这篇文章,它说C风格的cast很少是可取的,因为它可以被开发成一个
重新解释cast

然后我尝试使用
static\u cast
,但是我得到一个错误,说类型转换无效

ObjList *normalObjectList = static_cast<ObjList*> (box->ClipObjectInRect());
ObjList*normalObjectList=static_cast(box->ClipObjectInRect());
这也行不通

ObjList *normalObjectList = static_cast<vector<Object*>*> (box->ClipObjectInRect());
ObjList*normalObjectList=static_cast(box->ClipObjectInRect());

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

我可能错了,但我认为您可能需要在向量中投射每个单独的对象。我将尝试重载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
}
ObjList*ObjectBox::getBigObjectList()
{
向量返回向量
对于(向量::迭代器itr=ObjectBox.bigObjectList.begin();itr!=ObjectBox.bigObjectList.end();itr++)
{
返回向量推回(静态投射(itr));
}
返回向量
}
你把向量描述成列表有什么特别的原因吗?或者首先使用向量而不是列表


编辑:基本上是丹尼斯说的。

我可能错了,但我认为你可能需要在向量中投射每个单独的对象。我将尝试重载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
}
ObjList*ObjectBox::getBigObjectList()
{
向量返回向量
对于(向量::迭代器itr=ObjectBox.bigObjectList.begin();itr!=ObjectBox.bigObjectList.end();itr++)
{
返回向量推回(静态投射(itr));
}
返回向量
}
你把向量描述成列表有什么特别的原因吗?或者首先使用向量而不是列表


编辑:基本上是丹尼斯说的。

你的推理有一个非常常见的缺陷;我想我们都犯过同样的错误。您将
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
vector*bigVector=box->ClipObjectInRect();//好啊
ObjList*objVector=static_cast(bigVector);//不好,;我们现在来看看原因
objVector->push_back(新的SmallObject());//哎哟
如您所见,允许该强制转换将允许您尝试将
SmallObject*
放入只能包含
BigObject*
的对象中。这肯定会导致运行时错误


顺便说一下:您实际上可以在相关类型的数组之间进行强制转换。这是继承自C语言的一种行为。它会导致运行时错误:)

您的推理有一个非常常见的缺陷;我想我们都犯过同样的错误。您将
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
vector*bigVector=box->ClipObjectInRect();//好啊
ObjList*objVector=static_cast(bigVector);//不好,;我们现在来看看原因
objVector->push_back(新的SmallObject());//哎哟
如您所见,允许该强制转换将允许您尝试将
SmallObject*
放入只能包含
BigObject*
的对象中。这肯定会导致运行时错误


顺便说一下:您实际上可以在相关类型的数组之间进行强制转换。这是从C继承的行为。它会导致运行时错误:)

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


如果编译器不知道(或假装不知道)类型之间的关系,静态强制转换也会失败。如果您的继承在两个声明之间没有声明为“强>公共< /强>,编译器会将它们视为不相关类型,并给出相同的神秘警告。


这只咬了我一口,所以我想和大家分享一下。

静态演员不能演无关的角色types@DenisErmolin我不知道不相关类型的确切含义,因为它们是继承类型的向量,并且是使用
typedef
显式定义的。static\u cast不能转换为不相关类型types@DenisErmolin我不知道你说的无关类型到底是什么意思,因为它们是继承类型的向量,使用
typedef
显式定义。