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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 151
#1

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

26.08.2013, 16:54. Просмотров 502. Ответов 9
Метки нет (Все метки)

Добрый день.
Я делаю класс Pixel, и в этом классе есть функция Draw();
Так вот я создаю массив этих классов.

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

P.S. Создание функции которая будет циклом вызывать, не подходит!
Гдето видел об этом, правда забыл как это делать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2013, 16:54     Вызов функции сразу для массива всего классов
Посмотрите здесь:

Вызов функции массива указателей C++
Сразу три 1.анализ функции, 2.замена элементов массива, 3.максимальный элемент массива C++
C++ Использованием классов для создания массива
C++ Вызов массива в функции
Как вернуть сразу 2 значения массива в функции? C++
C++ 1. Вызов функции 2. Размер массива
Вызов функции из массива, через указатель C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raali
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,049
Завершенные тесты: 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
Сообщений: 151
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
2915 / 1344 / 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
Сообщений: 151
26.08.2013, 17:31  [ТС]     Вызов функции сразу для массива всего классов #6
lemegeton, хотелось бы узнать, зачем нужен "посредник" drawable, между этими двумя классами?

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

Жаль, что нельзя вызвать все одной функцией...
Raali
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,049
Завершенные тесты: 1
26.08.2013, 17:41     Вызов функции сразу для массива всего классов #7
для того чтобы вызвать одной функцией надо создавать класс surface с расставленными пикселами, и рисовать сразу прямоугольником через готовые функции
lemegeton
 Аватар для lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.08.2013, 17:46     Вызов функции сразу для массива всего классов #8
Цитата Сообщение от Xipxop Посмотреть сообщение
lemegeton, хотелось бы узнать, зачем нужен "посредник" drawable, между этими двумя классами?
Это интерфейс. С его помощью можно создавать различные классы, у которых будет общая функциональность -- их можно "рисовать".
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12520 / 7082 / 797
Регистрация: 27.09.2012
Сообщений: 17,489
Записей в блоге: 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++
C++ Вычислить значение функции y для x=a(h)b - получается всего один результат
C++ Вызов методов из классов
Функции для классов C++

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

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

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