2016-01-06 197 views
1

我必须找到动态创建对象的方法,这意味着用户可以决定在程序启动后要创建多少个对象。我试图做的是:创建动态对象(Eiffel)

   if count = 6 then 
       create player1.player 
       create player2.player 
       create player3.player 
       create player4.player 
       create player5.player 
       create player6.player 
        elseif count > 4 then 
        create player1.player 
        create player2.player 
        create player3.player 
        create player4.player 
        create player5.player 
         elseif count > 3 then 
         create player1.player 
         create player2.player 
         create player3.player 
         create player4.player 
          elseif count > 2 then 
          create player1.player 
          create player2.player 
          create player3.player 
          else 
          create player1.player 
          create player2.player 
       end 

一旦用户choosen的玩家数量,变量count更新,并且创建该对象的功能被调用。

我使用了这种蛮力方法,而不是循环,因为我需要对象的“名称”,我必须在程序中再次调用它们。

反正编译器给了我一个VEVI错误,变量没有正确设置。 有些帮助?

回答

0

如果所有playerN是声明为附接一类的属性的变量(即可能是这种情况,如果他们提供的类类型是默认连接,或类似的attached PLAYER否则类型的像PLAYER的类型),它们所有这些都将在创建过程结束时进行初始化。

假设某些属性可以是void,则相应的类型声明应该看起来像detachable PLAYER

在这个例子中,有2个变量总是附着在对象上,4个变量可能附着在对象上或者不附着在对象上。因此,他们需要被声明为

player1, player2: PLAYER 
player3, player4, player5, player6: detachable PLAYER 

如果示例代码出现的创建过程中player1player2总是被初始化

然后player1player2可以访问无人防守,但对于其他玩家的代码相似

if attached player5 as p then 
    p.whatever 
end 

是必需的。

如果所有player属性都可以是void,则所有这些属性都需要声明为detachable PLAYER

+0

非常感谢您的回答,但您能否告诉我是否有更有效的方法来执行此操作?是否可以使用列表和循环,而不是使用if语句? – DevX10

+0

@Ergo,当然,您可以将值存储在容器中,例如,在'ARRAYED_LIST [PLAYER]'中。您将创建容器对象,然后根据需要放入尽可能多的播放器对象。顺便说一句,在这种情况下''可拆卸'标记将不需要。(如果需要,我可以延长我的答案,并提供更多详细信息。) –

+0

感谢并为最近的答案感到遗憾,但我会对容器有更多的了解。为什么不可拆卸需要。 – DevX10

1

你有这个编译器错误,因为你的player1到player6被声明为挂接(这是默认值)。如果在程序执行过程中变量或属性可能无效,则必须将其声明为可拆卸。对于为例:

player1: detachable PLAYER 

之后,你想用你的变量或属性的每个时间,你必须测试它的附件(即使你知道它连接,编译器不)是这样的:

if attached player1 as la_player1 then 
    ... 
    do_something_with(la_player1) 
    ... 
end 

通过这种方式,编译器会知道你使用了一个附加的对象,并且不会给你任何VEVI错误进行编译。