构造函数和析构函数 - c ++

时间:2010-08-24 13:39:52

标签: c++ constructor destructor

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

谢谢, 李

抱歉 - 忘记提及我正在使用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();
};

4 个答案:

答案 0 :(得分: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];
}

这实际上只是一个愚蠢的技巧,因为编译器必须运行每个星的构造函数来初始化数组,然后运行EACH星的析构函数,因为它超出范围。

这也是一个糟糕的伎俩,因为主要功能中的所有工作都是不透明和不可见的。在这种情况下使用循环显然会更好,并且将延迟放在像这样的析构函数中实际上是令人困惑和不可维护的。

答案 1 :(得分:8)

这不是运行时递归:

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

template<> struct Star<0> {};

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

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

答案 2 :(得分:1)

根据您的最终评论,您的star课程的析构函数会延迟吗?例如,请参阅sleepusleep函数。

答案 3 :(得分:0)

由于Destructors / Constructors只是一个想法,它们可能不是你问题的正确标题。 我不知道你在哪个系统/环境,但是这个怎么样:

创建一个包含星号字符串的缓冲区,只需在代码中输入即可手动填写。

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

然后,您需要一个具有指向缓冲区背面的静态(!)指针的函数,并执行以下操作:

  • 调用缓冲区打印功能
  • 在当前指针位置
  • 下写入空字节
  • 减少静态指针
  • 等一段时间
  • 使用raise()
  • 提升自定义信号

在main()函数中,将自定义信号的信号处理程序设置为上述功能,然后提高自定义信号。