0

客户类

class
    CUSTOMER
create
    make

feature{NONE} -- Creation

make(a_name:STRING)
        -- Create a customer with an `account'
    local
        l_account: ACCOUNT
        l_name: IMMUTABLE_STRING_8
        l_bank: BANK
    do
        l_name := a_name
        name := l_name
        create l_account.make_with_name (a_name)
        create l_bank.make
        b := l_bank
        account := l_account
    ensure
        correct_name: name ~ a_name
        correct_balance: balance = balance.zero
    end

feature -- queries

name: IMMUTABLE_STRING_8

balance: VALUE
    do
        Result := account.balance
    end

account: ACCOUNT

b: BANK




 invariant
    name_consistency: name ~ account.name
    balance_consistency: balance = account.balance
 end

银行类的一部分:

   make  -- make a bank

       do
          count := 0
          create [ARRAY_LIST][CUSTOMER] customers.make(10)
          customers.count.set_Item(10)

       end

   new(name1: STRING) -- add a new customer to bank

       require 
         ....
       local
            c: CUSTOMER
       do
          create c.make(name1)
          customers.extend(c)
          count := count + 1




       ensure
          ...
       end

尝试将客户放入数组时,我从 ARRAY_LIST 类收到检查断言错误。我得到的标签是“valid_index”我不知道为什么它错了,因为索引是正确的,我设置了数组的计数并给出了正确的索引。

客户的类型是 CUSTOMER 类

银行有客户,客户有账户

CUSTOMER 有一个 ACCOUNT 类

4

2 回答 2

1

提供的代码存在一些问题。

  1. 创作指导

    create {ARRAYED_LIST [CUSTOMER]} customers.make (10)
    

    分配足够的空间来存储 10 个元素。它还设置customers.count0,列表中的当前元素数。无需使用您自己的count. 该代码还建议将该属性customers声明为 type ARRAYED_LIST [CUSTOMER]。在这种情况下,没有理由重复创建指令中的类型。它可以简化为

    create customers.make (10)
    
  2. customers.count将新元素添加到列表时自动更新。不应手动更改。(并且它不能按照另一个答案中的说明进行更改。)只是为了了解为什么您会违反先决条件,您可以customers.count在调用之前检查值customers.put_i_th(在调试器中或通过将值打印到控制台)。此时还没有添加任何元素,所以它是0.

  3. 因为ARRAYED_LIST是 的一个实现LIST,所以应该使用 的接口添加/删除项目LIST(看看这个类的特性很有帮助,包括继承的特性)。customers.put_i_th只能用于替换现有元素(正如其前提条件valid_index所暗示的并且功能注释确认:- 如果在索引间隔中,则替换i-th 条目,由v.)。将新元素添加到列表末尾的特定元素是extend,因此对应的行看起来像

    customers.extend (c)
    

一般建议是注意功能前提条件和功能注释,并查看类接口(如果您使用的是 Eiffel IDE,则有相应的视图)。这可能需要一些时间,但最终会得到回报。您可能还会发现样式指南中有关命名约定的部分很有用。

于 2016-01-15T07:42:41.140 回答
1

如果你查看特征“count”,你会发现它是一个函数,而不是一个属性。它返回 SPECIAL 的计数。然后编辑此结果。但是如果你看一下 {SPECIAL}.count,它是一个内置的外部例程,而不是一个属性。所以它可能不受你打电话的影响。(您可以在调用 put_i_th 之前测试 valid_index 来验证这一点)。

从根本上说,ARRAYED_LIST 是一个 LIST,而不是一个 ARRAY(它是一个 ARRAY,但这是一个实现细节)。因此,您的算法对于列表无效(您只能使用 extend 将新项目添加到列表的末尾,或者使用 put_front 将新项目添加到前面。后者在 ARRAYED_LIST 上效率低下。)

于 2016-01-15T06:29:55.127 回答