конструкторы и деструкторы - c ++ - PullRequest
3 голосов
/ 24 августа 2010

Мне нужно написать программу, которая печатает 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 ]

15 голосов
/ 24 августа 2010

Кажется, единственный возможный способ без циклов / рекурсии - это что-то вроде этого:

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

Это действительно просто глупый трюк, потому что компилятор должен запустить конструктор для каждой звезды, чтобы инициализировать массив, а затемдеструктор для КАЖДОЙ звезды, поскольку он выходит из области видимости.

Это также плохой трюк, так как все операции, выполняемые в основной функции, непрозрачны и невидимы.Очевидно, что было бы лучше использовать цикл в этом контексте и помещать задержку внутри деструктора, как это действительно сбивает с толку и не может быть поддержано.

8 голосов
/ 24 августа 2010

Это не рекурсия во время выполнения:

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 будет гарантировать порядок нанесения и удаления.

1 голос
/ 24 августа 2010

Исходя из вашего последнего комментария, может ли деструктор вашего класса star сделать задержку?См., Например, функции sleep или usleep.

0 голосов
/ 24 августа 2010

Поскольку деструкторы / конструкторы - это всего лишь идея, они, вероятно, не подходят для вашего вопроса. Я не знаю, в какой системе / среде вы находитесь, но как на счет этого:

Создайте буфер, содержащий строку с вашими звездами, просто вручную, введя их в код.

Затем напишите функцию, которая отображает буфер для любого окна вывода, которое вы используете.

Тогда вам понадобится функция, которая имеет статический (!) Указатель на заднюю часть буфера и выполняет следующие действия:

  • вызов функции печати буфера
  • Запись нулевого байта под текущей позицией указателя
  • Уменьшение статического указателя
  • Подождите некоторое время
  • Повышение пользовательского сигнала с помощью повышение ()

В функции main () вы устанавливаете обработчик сигнала для своего пользовательского сигнала на функцию, описанную выше, а затем повышаете собственный сигнал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...