У меня хранится массив объектов.Я хочу связаться с ними.Приведенный ниже код работает просто отлично:
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 говорит: «невозможно прочитать память»)