我尝试过这样做但在构造函数中出错。
E2029' OF'预期,但' ['结果
Dish = class
public
Dish_name: string;
Dish_id: integer;
Dish_number: integer;
Dish_units: string;
Dish_price: integer;
Dish_prime_cost: integer;
Dish_ingredients_id: array[1..100] of Ingredients;
constructor Create( NewDish_name: string;
NewDish_id: integer; NewDish_number: integer;
NewDish_units: string; NewDish_price: integer;
NewDish_prime_cost: integer;
NewDish_ingredients_id:array[1..100] of Ingredients);
destructor Destroy;
end;
成分是上课。
答案 0 :(得分:4)
您不能将静态数组声明为参数。您需要声明一个类型:
type
TIngredientsArray = array[1..100] of Ingredients;
然后将该类型用于您的字段和参数。
但是,静态大小的数组可能不是最佳选择。如果您需要超过100种成分怎么办?如果你只需要1,但被迫通过100左右怎么办?正如您的代码所代表的那样,菜肴类如何知道实际提供了多少成分?
请考虑使用动态数组。
您还应该考虑这些成分对象的生命周期和所有权。您将对象传递给菜类。它是否承担所有权?也就是说,谁负责销毁所有成分对象?如果您可以使用成分的值类型,即record
,那么您可能会发现使生命周期管理更简单。
在Delphi中对数组使用从零开始的索引也是惯用的。动态数组是从零开始的。标准集合类从零开始。如果您开始使用基于单一的阵列,那么经验表明您将来会存在混淆。
答案 1 :(得分:0)
您可以尝试以下方法:
Dish_ingredients_id: TArray<Ingredients>;
destructor Destroy; override;
public
procedure AddId(ingredient:Ingredients);
procedure AddId(ingredient:Ingredients);
var x:integer;
begin
x:= Length(Dish_ingredients_id) +1;
SetLength(Dish_ingredients_id,x);
Dish_ingredients_id[x-1] := ingredient;
end;
destructor Destroy;
var i:integer;
begin
for i := 0 to Length(Dish_ingredients_id)-1 do begin
if Dish_ingredients_id[i] <> nil then
Dish_ingredients_id[i].Free;
end;
inherited;
end;