Форум программистов, компьютерный форум CyberForum.ru

Вызов функции сразу для массива всего классов - C++

Восстановить пароль Регистрация
 
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
26.08.2013, 16:54     Вызов функции сразу для массива всего классов #1
Добрый день.
Я делаю класс Pixel, и в этом классе есть функция Draw();
Так вот я создаю массив этих классов.

Вопрос: Как мне вызвать функцию Draw() каждого экземпляра класса, не используя циклы, ну сразу вызвать одной функцией?

P.S. Создание функции которая будет циклом вызывать, не подходит!
Гдето видел об этом, правда забыл как это делать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
26.08.2013, 17:00     Вызов функции сразу для массива всего классов #2
без цикла разве что говнокодом :
C++
1
2
3
4
5
pixel[0].Draw();
pixel[1].Draw();
pixel[2].Draw();
...
pixel[999].Draw();
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
26.08.2013, 17:03  [ТС]     Вызов функции сразу для массива всего классов #3
Raali, понимаешь есть такая фишка про классы, там что-то родительные классы и какаето еще фича, которая позволяет вызвать функцию для всех экземпляров.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
26.08.2013, 17:08     Вызов функции сразу для массива всего классов #4
Xipxop, мб std::for_each ? но это тот же цикл, только вид сбоку
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.08.2013, 17:17     Вызов функции сразу для массива всего классов #5
Очевидно, вы про std::for_each с вызовом функции-члена в качестве параметра. Это, безусловно, тоже цикл, но написан за вас, хитрее и в одну строку.
Альтернатив не вижу. Нет синтаксиса в С++, который бы вызвал метод у всех элементов массива.

Пример с диспетчеризацией:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <algorithm>
#include <functional>
 
class Context {
 public:
  void drawPixel() {
    std::cout << "A pixel was drawn." << std::endl;
  } 
};
 
class Drawable {
 public:
  virtual void draw(Context &context) = 0;
};
 
class Pixel : public Drawable {
 public:
  virtual void draw(Context &context) {
    context.drawPixel();
  }
};
 
int main(int, char**) {
  Context context;
 
  const int numberOfDrawables = 10;
  Drawable *drawables = new Pixel[numberOfDrawables];
  
  // отрисовка всех Drawable в массиве
  std::for_each(drawables, drawables + numberOfDrawables,
    std::bind2nd(std::mem_fun_ref(&Drawable::draw), context));
  
  delete [] drawables;
  
}
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
26.08.2013, 17:31  [ТС]     Вызов функции сразу для массива всего классов #6
lemegeton, хотелось бы узнать, зачем нужен "посредник" drawable, между этими двумя классами?

про for_each, я примерно понял, но что такие: bind2nd, mem_fun_ref.

Жаль, что нельзя вызвать все одной функцией...
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
26.08.2013, 17:41     Вызов функции сразу для массива всего классов #7
для того чтобы вызвать одной функцией надо создавать класс surface с расставленными пикселами, и рисовать сразу прямоугольником через готовые функции
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.08.2013, 17:46     Вызов функции сразу для массива всего классов #8
Цитата Сообщение от Xipxop Посмотреть сообщение
lemegeton, хотелось бы узнать, зачем нужен "посредник" drawable, между этими двумя классами?
Это интерфейс. С его помощью можно создавать различные классы, у которых будет общая функциональность -- их можно "рисовать".
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
26.08.2013, 19:49     Вызов функции сразу для массива всего классов #9
Цитата Сообщение от Xipxop Посмотреть сообщение
P.S. Создание функции которая будет циклом вызывать, не подходит!
Рекурсия?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
struct Pixel {
   void draw ( ) {
      std::cout << this << std::endl ;
   }
} ; 
 
void call ( Pixel * arr , int size , void ( Pixel::*pointer ) ( ) ) {
   if ( size > 0 ) {
      ( arr ->* pointer ) ( ) ;
      call ( ++arr , size - 1 , pointer ) ;
   }
}
 
int main() {
   const int size = 20 ;
   Pixel arr [ size ] ;
   call ( arr , size , & Pixel::draw ) ;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2013, 20:01     Вызов функции сразу для массива всего классов
Еще ссылки по теме:

вызов функции из массива, через указатель.) C++
Вызов методов с одинаковыми именами для разных классов C++
C++ Вычислить значение функции y для x=a(h)b - получается всего один результат

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
26.08.2013, 20:01     Вызов функции сразу для массива всего классов #10
Цитата Сообщение от Xipxop Посмотреть сообщение
понимаешь есть такая фишка про классы, там что-то родительные классы и какаето еще фича, которая позволяет вызвать функцию для всех экземпляров.
Нельзя так сделать.
Yandex
Объявления
26.08.2013, 20:01     Вызов функции сразу для массива всего классов
Ответ Создать тему
Опции темы

Текущее время: 00:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru