Bonjour
je ne sais pas si c'est une subtilité du c++ : appeler un pointeur de fonction membre (de class toto) (toto::init)
depuis une autre classe (miaw) ,dans miaw les pointeurs de l' objet et de la fonction membre sont static.
je les initialise avec une fonction static de miaw.(multiple instance de miaw) ( une seul instance de toto)
puis j'appelle une fonction de toto membre (non static) toto::lol() qui appelle miaw::alarm() ( qui appele le pointeur de fn sur toto::init)
si toto est définit/ implémenté dans ses fichiers respectif
j'ai un access read violation.
si toto est définit dans le même fichier que miaw l'exécution est ok.
si au lieu d'initialise avec une fonction static je passe le pointeur de lobjet et de lafonction membre par le constructeur de toto : l'execution est ok.
je suis sur VS2013 community patch4
c'est un bug que j'ai reproduit dans un programme
un contournement est possible avec une fonction simple en callback avec un toto en argument
qu'elle est la norme a ce sujet?( les règles?)
merci
miaw.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #pragma once class toto; typedef void(toto::*Functest)(); class miaw { static toto* c_d; static Functest c_init_callback; public: miaw() = default; void alarm(); static void set_callback(toto*const tot, Functest callback); };
miaw.cpp
main.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include "miaw.h" toto* miaw::c_d = nullptr; Functest miaw::c_init_callback = nullptr; void miaw::alarm() { (c_d->*c_init_callback)(); } void miaw::set_callback(toto*const tot, Functest callback) { c_d = tot; c_init_callback = callback; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #pragma once #include <memory> #include "miaw.h" class toto { miaw* m_miaw; public: toto() :m_miaw(nullptr) { miaw::set_callback(this, &toto::init); m_miaw = new miaw; } ~toto() { delete m_miaw; } void init() { int i = 0; } void lol() { m_miaw->alarm(); } }; int main() { toto dou; dou.lol(); return 0; }
Partager