【问题标题】:constructors and destructors - c++构造函数和析构函数 - C++
【发布时间】:2011-04-03 04:34:21
【问题描述】:

我需要编写一个程序,在屏幕上(随机位置)打印 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();
};

【问题讨论】:

  • 什么语言?你能发布你的代码吗?
  • 你用什么语言或格式写这个?
  • 您使用什么语言,您尝试过什么?听起来像家庭作业...
  • 构造函数和析构函数很酷,也可以尝试使用终结器:)
  • 你能用循环编写代码来编写没有循环的代码吗?这可能会解决没有循环的问题。而不是for(int i = 0; i < 100; i++) { \* CODE *\ },您只需打印代码 100 次。

标签: c++ constructor destructor


【解决方案1】:

似乎没有循环/递归的唯一方法是这样的:

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];
}

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

这也是一个坏技巧,因为主函数中的所有工作都是不透明且不可见的。在这种情况下使用循环显然会更好,并且像这样将延迟放在析构函数中确实令人困惑且无法维护。

【讨论】:

  • 问题是,在你的代码中,析构函数根本不会被调用,因为 S 只是一个指针,当它超出范围时什么都不做。
  • @fat-lobyte: S 不是指针。 S 是一个包含 100 个 Star 对象的数组。
【解决方案2】:

这不是运行时递归:

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会保证绘制和移除的顺序。

【讨论】:

  • 这些不是你要找的机器人。
【解决方案3】:

根据您的最终评论,您可以让 star 类的析构函数延迟吗?例如,请参阅 sleepusleep 函数。

【讨论】:

    【解决方案4】:

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

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

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

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

    • 调用缓冲打印函数
    • 在当前指针位置下写入一个空字节
    • 减少静态指针
    • 等待一段时间
    • 使用raise() 发出自定义信号

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

    【讨论】:

      猜你喜欢
      • 2010-12-16
      • 2012-04-10
      • 2012-11-14
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2014-05-27
      相关资源
      最近更新 更多