481 / 9 / 6
Регистрация: 28.12.2011
Сообщений: 151
1

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

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

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

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

P.S. Создание функции которая будет циклом вызывать, не подходит!
Гдето видел об этом, правда забыл как это делать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2013, 16:54
Ответы с готовыми решениями:

Выделение памяти в new для всего массива сразу
Подскажите пожалуйста, как переделать программу, чтобы выделение памяти для массива в new было...

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

Диаграмма классов для всего проекта
Проект состоит из нескольких решений эти решения взаимодействуют между собой можно ли построить...

Вызов метода одного из элементов динамического массива классов
Есть метод класса: int dates::FirstClock() { ShowMessage(name+text); return 0; } Создание...

9
858 / 447 / 112
Регистрация: 06.07.2013
Сообщений: 1,494
26.08.2013, 17:00 2
без цикла разве что говнокодом :
C++
1
2
3
4
5
pixel[0].Draw();
pixel[1].Draw();
pixel[2].Draw();
...
pixel[999].Draw();
0
481 / 9 / 6
Регистрация: 28.12.2011
Сообщений: 151
26.08.2013, 17:03  [ТС] 3
Raali, понимаешь есть такая фишка про классы, там что-то родительные классы и какаето еще фича, которая позволяет вызвать функцию для всех экземпляров.
0
574 / 557 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
26.08.2013, 17:08 4
Xipxop, мб std::for_each ? но это тот же цикл, только вид сбоку
0
3967 / 2020 / 727
Регистрация: 29.11.2010
Сообщений: 4,334
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;
  
}
1
481 / 9 / 6
Регистрация: 28.12.2011
Сообщений: 151
26.08.2013, 17:31  [ТС] 6
lemegeton, хотелось бы узнать, зачем нужен "посредник" drawable, между этими двумя классами?

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

Жаль, что нельзя вызвать все одной функцией...
0
858 / 447 / 112
Регистрация: 06.07.2013
Сообщений: 1,494
26.08.2013, 17:41 7
для того чтобы вызвать одной функцией надо создавать класс surface с расставленными пикселами, и рисовать сразу прямоугольником через готовые функции
0
3967 / 2020 / 727
Регистрация: 29.11.2010
Сообщений: 4,334
26.08.2013, 17:46 8
Цитата Сообщение от Xipxop Посмотреть сообщение
lemegeton, хотелось бы узнать, зачем нужен "посредник" drawable, между этими двумя классами?
Это интерфейс. С его помощью можно создавать различные классы, у которых будет общая функциональность -- их можно "рисовать".
0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 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 ) ;
}
2
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
26.08.2013, 20:01 10
Цитата Сообщение от Xipxop Посмотреть сообщение
понимаешь есть такая фишка про классы, там что-то родительные классы и какаето еще фича, которая позволяет вызвать функцию для всех экземпляров.
Нельзя так сделать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2013, 20:01
Помогаю со студенческими работами здесь

Вычислите интеграл от функции для каждого интервала и сумму интегралов для всего диапазона изменения функции.
Вычислите интеграл от функции для каждого интервала и сумму интегралов для всего диапазона...

Вызов методов с одинаковыми именами для разных классов
В функцию func можно передать один из двух классов A или B. У них есть функции с одинаковыми...

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет...

В фреймворке есть вызов двух методов сразу для одного обьект как так ?
&lt;?= $form-&gt;field($model, 'email')-&gt;label('Почта')-&gt;input('email'); ?&gt; функция label()...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru