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

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

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

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

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

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

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

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

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

Сразу три 1.анализ функции, 2.замена элементов массива, 3.максимальный элемент массива - C++
1. Протабулировать заданную функцию y = f(x) на промежутке с постоянным шагом h. интервал =; шаг h=0.1; система уравнений (х-1)^4 и...

Как вернуть сразу 2 значения массива в функции? - C++
Собственно дан у меня например массив "aa", где l-левая граница, а r-правая. При выполнении кода мне надо сразу вернуть эти два стоящих...

Вызов массива в функции - C++
помогите пожалуйста. не получается вызвать массив подсчитанный в функции god. kol считает верно, и выводит в функции main. а массив "а"...

Вызов функции массива указателей - C++
Добрый вечер, изучая с++ наткнулся на код: #include <cstdio> #include <cstdlib> #include <iostream> using namespace...

1. Вызов функции 2. Размер массива - C++
Уважаемые форумчане! случился баттхерт с ниже перечисленными вопросами, помогите пожалуйста! 1. void swap(void *v, int i, int j) { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 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
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 151
26.08.2013, 17:03  [ТС] #3
Raali, понимаешь есть такая фишка про классы, там что-то родительные классы и какаето еще фича, которая позволяет вызвать функцию для всех экземпляров.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
26.08.2013, 17:08 #4
Xipxop, мб std::for_each ? но это тот же цикл, только вид сбоку
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 151
26.08.2013, 17:31  [ТС] #6
lemegeton, хотелось бы узнать, зачем нужен "посредник" drawable, между этими двумя классами?

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

Жаль, что нельзя вызвать все одной функцией...
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
26.08.2013, 17:41 #7
для того чтобы вызвать одной функцией надо создавать класс surface с расставленными пикселами, и рисовать сразу прямоугольником через готовые функции
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
26.08.2013, 17:46 #8
Цитата Сообщение от Xipxop Посмотреть сообщение
lemegeton, хотелось бы узнать, зачем нужен "посредник" drawable, между этими двумя классами?
Это интерфейс. С его помощью можно создавать различные классы, у которых будет общая функциональность -- их можно "рисовать".
Croessmah
Модератор
Эксперт CЭксперт С++
13139 / 7402 / 829
Регистрация: 27.09.2012
Сообщений: 18,242
Записей в блоге: 3
Завершенные тесты: 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 ) ;
}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
26.08.2013, 20:01 #10
Цитата Сообщение от Xipxop Посмотреть сообщение
понимаешь есть такая фишка про классы, там что-то родительные классы и какаето еще фича, которая позволяет вызвать функцию для всех экземпляров.
Нельзя так сделать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2013, 20:01
Привет! Вот еще темы с ответами:

Вызов функции из массива, через указатель - C++
имею код #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;utility&gt; using namespace std; void Func() { cout&lt;&lt;&quot;pFunc()&quot;; } ...

Функции для классов - C++
class Goods { public: virtual void Show() = 0; }; class Toy :public Goods { private: char* nameT;

Вычислить значение функции y для x=a(h)b - получается всего один результат - C++
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;math.h&gt; using namespace std; int main() { double y,x, a, b, h; x=1; ...

Вызов методов из классов - C++
class B; class A { public: void foo() { B x; //Хотел вызвать метод нижнего класса. (Без наследования). x.foo(); } ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.08.2013, 20:01
Ответ Создать тему
Опции темы

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