Правильный способ приведения для параметра-метода - PullRequest
0 голосов
/ 04 марта 2019

У меня хранится массив объектов.Я хочу связаться с ними.Приведенный ниже код работает просто отлично:

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 говорит: «невозможно прочитать память»)

...