2010-08-24 225 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

相關問題