Delphi typcast элементы списка C ++ подход

Привет у меня есть один вопрос, касающийся некоторых подходов приведения типов. Я перевожу некоторые файлы Delphi на C ++. У меня есть объявление класса delphi, которое является производным от TList, и это базовый класс для других производных классов.

type TBaseItem = class (TObject)
public
procedure SomeProcedure; virtual; abstract;
end;

Type TBaseClass = class(TList)
private
function GetItem(Index: Integer): TBaseItem;
procedure SetItem(Value: TBaseItem; Index: Integer);
public
property Items[Index: Integer]: TBaseItem read GetItem write SetItem;
end;function TBaseClass.GetItem(Index: Integer): TBaseItem;
begin
Result := TBaseItem(inherited Items[Index]);
end;

procedure TBaseClass.SetItem(Value: TBaseItem; Index: Integer);
begin
inherited Items[Index] := Value;
end;

Это два базовых класса TBaseItem и TBaseClass. Итак, здесь объявлены новые классы TchildItem, производные от TBaseItem и TChildClass, производные от TBaseClass. TChildItem переопределяет метод SomeMethod, и, что более важно, TChildtClass переопределяет свойство Items таким образом, что теперь мы возвращаем элементы TParentItem, созданные из TBaseItem.

type TChildItem = class (TBaseItem)
public
procedure SomeProcedure; override;
end;

type TChildClass = class(TBaseClass)
private
function GetItem(Index: Integer): TChildItem;
procedure SetItem(Value: TChildItem; Index: Integer);
public
property Items[Index: Integer]: TChildItemread GetItem write SetItem;
end;

function TChildClass .GetItem(Index: Integer): TChildItem;
begin
Result := TChildItem(inherited Items[Index]);
end;

procedure TChildClass.SetItem(Value: TChildItem; Index: Integer);
begin
inherited Items[Index] := Value;
end;

В этом примере я хотел показать, как легко можно получить классы и переопределить свойства. Чтобы получить правильный тип элемента из списка, достаточно вызвать родительское (базовое) свойство Item и привести его к нужному типу. Это Delphi Apporach.

Интересно, как я могу перевести эту часть кода на C ++. В настоящее время я объявил новый базовый класс, который не является производным от какого-либо класса и имеет открытую переменную Var Items, которая

class TBaseItem{
virtual void SomeMethod();
}

class TBaseClass {
public:
vector<TBaseItem> Items;
};class TChildItem : public TBaseItem{
}

class TChildClass : public TBaseClass {
};

а затем использовать

return (TChildItem) Items[Idx]

Это означает, что я хотел бы получить доступ к общедоступным переменным родителя (TBaseClass), таким как этот Vector Items, и привести их к нужному типу … Мое первое впечатление, что я мог бы пойти в неправильном направлении с этим подходом Delphi.

Что ты предлагаешь? Как я должен идти с этим?

БОЛЬШОЕ СПАСИБО!

1

Решение

Delphi-код — старый и предшествующий дженерикам, аналог Delphi для шаблонов C ++. В современном Delphi-коде эти классы списков просто не существуют. Вместо этого можно было бы использовать TList<TBaseItem> а также TList<TChildItem>,

В коде C ++ вы просто используете vector<TBaseItem*> а также vector<TChildItem*>, В вашем переводе на C ++ просто нет смысла реализовывать TBaseClass а также TChildClass,

Я также исправил бы вашу терминологию. Свойства Delphi не могут быть переопределены. Новая недвижимость в TChildClass это просто новая собственность.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]