方法参考参数的正确转换方法

时间:2019-03-04 13:25:30

标签: c++ casting reference parameter-passing

我存储了一组对象。我想联系他们。以下代码可以正常工作:

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说“无法读取内存”)

0 个答案:

没有答案