2015-09-24 117 views
1

我想要創建一個CONTAINER類,它維護一個CRITTER對象數組(我已經創建和測試過了),注意,有各種CRITTER子類,它們是從CRITTER超級類)。目的是從這個數組中添加和刪除CRITTER對象。這是容器類的樣子:如何在Eiffel中添加和刪除數組中的對象

class 
    CONTAINER 
    create 
    make 

feature 

    num: detachable INTEGER 
    list: ARRAY[CRITTER] 

    make 
     local 

     do 
      create list.make_empty 
      num := 0 
     end 

     addCritter(critter: CRITTER) 
     do 
      list.put(animal, num) 
      num := num + 1 
     end 

     removeCritter(critter: CRITTER) 
     do  
      list.put (list.at (num), ???) -- put last element in position of element to be removed 
      list.remove_tail (num) -- remove tail 
      num := num - 1 
     end 

end 

兩個問題: 首先,我可以實例中應用的容器類,但是當我打電話

create container.make 
container.addCritter(myCritter) 

我得到的一個先決條件,無效指數違規第二行錯誤。這可能是因爲我沒有設置數組的上限和下限。但是,當我嘗試這樣做時,出現語法錯誤。哪種方法可以解決這個問題?

其次,爲了從數組中刪除一個對象,如果我能夠獲得索引值,將會有所幫助,但是我看不到任何這樣做的函數,除非我遺漏了某些東西。

回答

1

ARRAY s通常用於固定長度的容器。在你的情況下,有很多動態變化,最好使用更多動態結構,例如ARRAYED_LIST。與ARRAY類似,它提供了按索引訪問項目的功能,但也有更方便的功能。可以使用功能extend添加新元素。如果只需要刪除一個與給定元素匹配的元素,則可以通過使用功能prune刪除舊元素,如果需要刪除所有匹配元素,則可以刪除舊元素。 「匹配」一詞表示參考或對象相等,具體取決於所需的比較標準:=~。比較標準使用功能compare_objects進行更改。

一些一般性的意見:

  • 沒有必要跟蹤元素自己數字,通常還有一個特點count提供這個號碼。
  • 指標的艾菲爾通常從1開始,而不是因爲INTEGER膨脹並無論任何附着標記的所有擴展類型附0
  • 聲明detachable INTEGER相當於INTEGER

下面的討論也可能是有用的: How to initialise an array of objects in Eiffel?

相關問題