2010-08-24 226 views
3

我需要编写一个程序,在屏幕上随机打印100个星星,然后星星慢慢消失 - 一个接一个。我不允许使用循环或递归。我试图玩弄构造函数和析构函数,但我不能让星星一个接一个消失(而不是所有的一起)。 任何想法?构造函数和析构函数 - C++

感谢, 李

对不起 - 忘了提我使用C++

我现在的访问违反无用代码:

class star { 
    int x; 
    int y; 
public: 
    star(){ 
     x = rand()%80; 
     y = rand()%80; 
     PaintcharOnRandomLocation('*',x,y); 
    }; 
    ~star(){ 
     PaintcharOnRandomLocation(' ',x,y); 
    }; 

}; 

class printAll{ 
    star* arr; 
public: 
    printAll(){ 
    arr = new star[100]; 
    }; 


    ~printAll(){ 
     delete[] arr; 
    }; 


}; 
void doNothing(printAll L){ 
}; 

void main() 
{ 
    srand (time(NULL)); 
    doNothing(printAll()); 

    getch(); 
}; 
+0

什么语言?你能发布你的代码吗? – 2010-08-24 13:41:34

+0

平台/语言? – 2010-08-24 13:41:37

+0

你在写什么语言或格式? – mikek 2010-08-24 13:41:40

回答

15

似乎只是可能没有循环的方式/递归这样的事情:

class Star 
{ 
    Star() 
    { 
    //constructor shows star in a a random place 
    } 
    ~Star() 
    { 
    //destructor removes star and sleeps for a random amount of time 
    } 
}; 

int main() 
{ 
    Star S[100]; 
} 

这个我因为编译器必须运行每颗恒星的构造函数来初始化数组,然后再初始化每个恒星的析构函数,因为它超出了范围。

这也是一个坏的窍门,因为所有在主函数中运行的工作都是不透明和不可见的。在这种情况下使用循环显然会更好,并将延迟放入像这样的析构函数中是非常令人困惑和难以维护的。

+0

以秒为单位击败我。 +1 – Beta 2010-08-24 13:55:56

+0

不错的主意。这是我的+1。 – ereOn 2010-08-24 13:56:39

+0

问题是,在你的代码中,析构函数根本不会被调用,因为S只是一个指针,当它超出作用域时它什么也不做。 – 2010-08-24 13:56:53

1

根据你的最终评论,你可以让你的star类的析构函数延迟吗?例如参见sleepusleep的功能。

0

由于析构函数/构造函数只是一个想法,它们可能不是您的问题的正确标题。 我不知道你在什么系统/环境,但这个怎么样:

创建一个包含你星星的字符串的缓冲区,只需在代码中输入它们即可。

接下来,编写一个函数,将缓冲区显示到您使用的任何输出窗口。

然后,你需要有一个静态指针到缓冲区背面的功能,并执行以下(!):

  • 调用缓存打印功能
  • 写空字节在当前的指针位置
  • 递减静态指针
  • 等待一段时间
  • 引发自定义的信号与raise()

在main()函数中,您将自定义信号的Signal Handler设置为上述函数,然后提升自定义信号。

8

这不是一个运行时递归:

template<int N> 
struct Star 
{ 
    Star() { DrawAtRandomPlace(); } 
    ~Star() { RemoveSlowly(); } 
    Star<N-1> star; 
}; 

template<> struct Star<0> {}; 

int main() 
{ 
    Star<100> stars; 
} 

上面的代码将生成星模板的100个不同的实例。 RAII将保证绘图和删除的顺序。

+0

这些不是你正在寻找的机器人。 – Tom 2010-08-24 14:00:54

+1

+1 one - template loop unwinding ftw。 – Elemental 2010-08-24 14:02:53

+0

+1,也许'RemoveAtRandomPace();' – Potatoswatter 2010-08-24 14:59:24

相关问题