我存储了一组对象。我想联系他们。以下代码可以正常工作:
class Primitive
{
public:
int SomePrimitiveValue = 5;
};
class Derived : public Primitive
{
public:
int SomeDerivedValue = 8;
};
Primitive * ExtractTheLast()
{
if (FCount > 0)
{
Primitive * result = *((Primitive**)((char*)FData + (FCount - 1 * TypeSize())));
RemoveByIndex(FCount - 1);
return result;
}
return nullptr;
}
int main()
{
Derived * result = (Derived *)ExtractTheLast();
if (!result)
result = new Derived();
}
但是我想看看此访问操作ExtractTheLast
是否成功,所以我修改了代码;例如:
bool ExtractTheLast(Primitive *& lastItem)
{
if (FCount > 0)
{
lastItem = *((Primitive**)((char*)FData + (FCount - 1 * TypeSize())));
RemoveByIndex(FCount - 1);
return true;
}
lastItem = nullptr;
return false;
}
int main()
{
Derived * result = nullptr;
if (!ExtractTheLast((Primitive*&)result))
result = new Derived();
}
在这段代码中,ExtractTheLast((Primitive*&)result)
并没有达到我的预期效果,我的猜测是编译器进行转换,或者可能将类的内容数据视为Primitive
,并返回一个损坏的对象。
我的问题是如何在方法的参数区域内正确键入强制类型转换?而且我真的不想使用像ExtractTheLast<Derived>()
这样的模板。
-------------------编辑---------------------
在我意识到我的问题还不够清楚之后,我尝试对它进行总结,但无法获得与项目相同的结果,因此我决定以两种方式显示第一种可行的方法,而第二种给出有趣的结果。
请记住,我只想知道这两行代码之间的区别
(RenderRequestO *)Requests_idle->GetTheLast()
和
Requests_idle->GetTheLast((PrimitiveO*&)result)
其中一个直接返回对象,另一个作为参数返回,我认为当我尝试在参数块内键入强制类型转换时,编译器给出了错误的结果。
这是正常的代码:
MutexLock(mutex);
RenderRequestO * result = Requests_idle->Count() > 0 ? (RenderRequestO *)Requests_idle->GetTheLast() : new RenderRequestO();
if (Requests_idle->Count() > 0)
Requests_idle->RemoveLast();
...
..
这是代码不起作用,因为我希望它是
MutexLock(mutex);
RenderRequestO * result = nullptr;
if (!Requests_idle->GetTheLast((PrimitiveO*&)result))
result = new RenderRequestO();
...
..
如果我得到诸如(RenderRequestO *)Requests_idle->GetTheLast()
之类的相关对象,则工作正常,但如果我试图获得Requests_idle->GetTheLast((PrimitiveO*&)result)
之类的对象,它将返回一个对象,但其派生字段均不可访问(当我移动鼠标时在它上面,Intellisense说“无法读取内存”)