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

Указатели на метод класса - C++

Восстановить пароль Регистрация
 
Anklav
 Аватар для Anklav
435 / 293 / 21
Регистрация: 23.01.2013
Сообщений: 618
Завершенные тесты: 2
15.03.2013, 13:57     Указатели на метод класса #1
Допустим есть 2 класса:

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
class A
{
public:
   A() {}
   ~A() {}
 
   virtual void Draw(GLuint shader)
   {
        //делаем что-то
   }
}
 
class main
{
public:
   main() {}
   ~main() {}
 
   void Init()
   {
      draw = clA.Draw;//как правильно сделать вот это? 
   }
 
private:
   void (*draw)(GLuint);
 
   A clA;
}
Добавлено через 14 минут
ЗЫ классов А может быть несколько
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.03.2013, 14:00     Указатели на метод класса #2
Цитата Сообщение от Anklav Посмотреть сообщение
C++
1
void (*draw)(GLuint);
C++
1
void (A::*draw)(GLuint);
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.03.2013, 14:04     Указатели на метод класса #3
зачем вообще иметь указатели на метод класса, когда можно держать указатель на сам класс?

Не по теме:

(точнее на его экземпляр, конечно)

gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.03.2013, 14:05     Указатели на метод класса #4
Цитата Сообщение от Anklav Посмотреть сообщение
C++
1
draw = clA.Draw;
C++
1
draw = &A::Draw;
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.03.2013, 14:05     Указатели на метод класса #5
Цитата Сообщение от Anklav Посмотреть сообщение
draw = clA.Draw;//как правильно сделать вот это?
Что-то мне подсказывает (виртуальная функция), что это Вам вообще не нужно.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.03.2013, 14:13     Указатели на метод класса #6
Kuzia domovenok, Дерзайте...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
class A
{
public:
   void ff() { std::cout << "ff" << std::endl; }
   void fff() { std::cout << "fff" << std::endl; }
};
 
void call(A& ref, void (A::*function)())
{
   (ref.*function)();
}
 
int main()
{
   A a;
   void (A::*function1)() = &A::ff;
   call(a, function1);
   void (A::*function2)() = &A::fff;
   call(a, function2);
}
Anklav
 Аватар для Anklav
435 / 293 / 21
Регистрация: 23.01.2013
Сообщений: 618
Завершенные тесты: 2
15.03.2013, 14:30  [ТС]     Указатели на метод класса #7
Дополню код для понятности.

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class A
{
public:
   A() {}
   ~A() {}
 
   virtual void Draw(GLuint shader)
   {
        //делаем что-то
   }
}
 
class B
{
public:
   B() {}
   ~B() {}
 
   virtual void Draw(GLuint shader)
   {
        //делаем что-то не тоже что в class A;
   }
}
 
class mainClass
{
public:
   mainClass() {}
   ~mainClass() {}
 
   void SetClassA()
   {
        draw = clA.Draw;
   }
 
   void SetClassB()
   {
        draw = clB.Draw;
   } 
 
   void Draw(GLuint shader)
   {
       (*draw)(shader);
   }
 
private:
   void (*draw)(GLuint);
 
   A clA;
   B clB;
}
 
void main()
{
     ...
     
     mainClass clMain;
     clMain.SetClassA();
     clMain.Draw(shader);
}
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.03.2013, 14:34     Указатели на метод класса #8
Цитата Сообщение от Anklav Посмотреть сообщение
Дополню код для понятности.
Виртуальность есть, а иерархии классов нет. Ну, куда такое годится?!
Сделайте общий базовый класс для А и Б и объявите в нем виртуальную функцию.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.03.2013, 14:35     Указатели на метод класса #9
Anklav, Вам уже показали как использовать указатели. Так как используете вы - делать нельзя. Логичнее использовать полиморфизм, чем указатели на функции. Если используете virtual, значит либо это наследник, либо это чей-то родитель... Таким образом, если наследник:

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
37
38
39
40
41
42
43
44
45
class Base
{
   virtual ~Base() {}
   virtual void Draw(GLuint) = 0;
};
 
class A : public Base
{
public:
   virtual void Draw(GLuint shader)
   {
        //делаем что-то
   }
}
 
class B : public Base
{
public:
   virtual void Draw(GLuint shader)
   {
        //делаем что-то не тоже что в class A;
   }
}
 
class main
{
public:
   void set(Base& ref) { ptr = &ref; }
   void Draw(GLuint shader)
   {
       ptr->draw(shader);
   }
   Base* ptr;
}
 
int main()
{
   main m;
   A a;
   B b;
   m.set(a);
   m.draw(shader);
   m.set(b);
   m.draw(shader);
}
Anklav
15.03.2013, 14:37  [ТС]
  #10

Не по теме:

я их так не использую, я написал такой код, для того что бы объяснить что мне надо сделать - не более.
Думал можно без полиморфизма это сделать

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.03.2013, 14:39     Указатели на метод класса #11
Anklav, Это совершенно отвлеченный пример, с непонятно зачем нужными virtual-ами и прочим. Не показана иерархия, не показано ничего. Просто сделайте нормальный пример, который будет показывать, ЧТО вам нужно сделать. Минимальный пример, который полностью раскрывает суть вопроса.
Anklav
 Аватар для Anklav
435 / 293 / 21
Регистрация: 23.01.2013
Сообщений: 618
Завершенные тесты: 2
15.03.2013, 15:05  [ТС]     Указатели на метод класса #12
Мне нужно организовать что-то типо событий в C#
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
namespace WindowsFormsApplication2
{
    public class A
    {
        public void Draw(object sender, EventArgs e)
        {
            MessageBox.Show("A");
        }
    }
 
    public class B
    {
        public void Draw(object sender, EventArgs e)
        {
            MessageBox.Show("B");
        }
    }
 
    public class MainClass
    {
        public event EventHandler OnDraw;
 
        public void CallDraw()
        {
            if (OnDraw != null)
                OnDraw(this, EventArgs.Empty);
        }
    }
 
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            A ClA = new A();
            B ClB = new B();
 
            MainClass ClMain = new MainClass();
 
            ClMain.OnDraw += ClA.Draw;
            ClMain.CallDraw();
 
            ClMain.OnDraw -= ClA.Draw;
 
            ClMain.OnDraw += ClB.Draw;
            ClMain.CallDraw();
        }
 
    }
}
Ваш последний код, только вы передаете в методе set ссылку на класс, а нужно - метод. И желательно это делать без общего родителя.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.03.2013, 15:20     Указатели на метод класса #13
Anklav, Просто так это не сделать. Классы разные, а указатель на функцию класса требует указания класса, для которого эта функция используется. Можно использовать С++11 std::bind или же boost::bind + std/boost ::function...

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
37
38
39
40
41
42
43
#include <iostream>
#include <functional>
 
class A
{
public:
   void draw() { std::cout << "A::draw" << std::endl; }
};
 
class B
{
public:
   void draw() { std::cout << "B::draw" << std::endl; }
};
 
class Drawer
{
public:
   void set_function(const std::function<void()>& draw_f)
   {
      on_draw = draw_f;
   }
   void call()
   {
      if (on_draw)
      {
         on_draw();
      }
   }
private:
   std::function<void()> on_draw;
};
 
int main()
{
   Drawer d;
   A a;
   d.set_function(std::bind(&A::draw, std::ref(a)));
   d.call();
   B b;
   d.set_function(std::bind(&B::draw, std::ref(b)));
   d.call();
}
http://liveworkspace.org/code/x7WIu$0
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.03.2013, 15:23     Указатели на метод класса #14
В ++ нет делегатов как в #, есть std::/boost::function + bind:
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
37
38
39
40
41
42
43
44
#include <iostream>
#include <functional>
 
 
typedef unsigned GLuint;
 
class A {
    
public: 
   void Draw(GLuint shader) {
       std::cout << "A " << shader << std::endl;
        //делаем что-то
   }
};
 
class B {
public:
 
   void Draw(GLuint shader) {
       std::cout << "B " << shader << std::endl;
        //делаем что-то не тоже что в class A;
   }
};
 
class mainClass {
    
public:    
   std::function<void (GLuint)> draw;
};
 
 
int main() {
    using namespace std::placeholders;
    
    mainClass m;
    A a;
    B b;
    
    m.draw = std::bind(&A::Draw, a, _1);
    m.draw(1);
    
    m.draw = std::bind(&B::Draw, b, _1);
    m.draw(2);
}
Добавлено через 40 секунд
http://ideone.com/tPvT7f

Добавлено через 1 минуту

Не по теме:

не успел )

Anklav
 Аватар для Anklav
435 / 293 / 21
Регистрация: 23.01.2013
Сообщений: 618
Завершенные тесты: 2
15.03.2013, 16:39  [ТС]     Указатели на метод класса #15
В моем распоряжении C++11 нету. (программу пишу на смартфон, там вот такие дела)
Значит кроме как использование вашего раннего варианта(с общим предком) ничего нет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2013, 16:40     Указатели на метод класса
Еще ссылки по теме:

C++ Как передать в метод класса Menu указатель на метод дочернего класса?
Указатели на члены класса C++
Может ли метод родительского класса обратиться к полю дочернего класса C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.03.2013, 16:40     Указатели на метод класса #16
Anklav, Можно написать свой ограниченный std::function/std::bind. В С++98/03 без использования сторонних библиотек - только писать свое.
Yandex
Объявления
15.03.2013, 16:40     Указатели на метод класса
Ответ Создать тему
Опции темы

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