如何在Delphi中声明数组对象字段?

时间:2015-07-13 20:46:51

标签: delphi object properties constructor

我尝试过这样做但在构造函数中出错。

  

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;

成分是上课。

2 个答案:

答案 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;