Il semble que vous soyez confus sur le fonctionnement des pointeurs de fonction membres. Pour une classe donnée, il n'y a qu'une seule instance d'une fonction donnée. Ils sont différenciés par l'utilisation du paramètre implicite this
. Fondamentalement, vous pouvez prétendre que vous avez le mappage suivant.
struct Struct { void Function(); }
Struct a;
a.Function();
se transforme en
struct Struct { }
void Function(Struct* this);
Struct a;
Function(&a);
Donc, si vous avez un tas d'objets Struct
et que vous voulez appeler Function
sur un petit nombre d'entre eux, vous ne stockez Function
, vous stockez Struct
.
Les pointeurs vers les fonctions membres sont utilisés lorsque vous avez plusieurs fonctions que vous souhaitez appeler de manière sélective. Donc, si vous avez deux fonctions dans votre classe, toutes deux ne prenant aucun paramètre et renvoyant un void, void (Struct::*)()
peut pointer vers l'une ou l'autre. Mais il pointe toujours vers une fonction spécifique, dont il n'y en a qu'une seule. Vous devez toujours fournir le paramètre this
.
struct Struct {
Struct(int v) : value(v) { }
void One() { cout << "one: " << value << endl; }
void Two() { cout << "two: " << value << endl; }
int value;
};
int main()
{
std::vector<Struct> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
std::vector<void (Struct::*)()> f;
f.push_back(&Struct::One);
f.push_back(&Struct::Two);
f.push_back(&Struct::One);
for(int i = 0; i < 3; ++i)
(v[i].*f[i])();
}
Ce n'est pas le meilleur exemple, mais cela fait passer le message. Vous pouvez mélanger et assortir des objets, avec des fonctions membres.
* edit: Un exemple sans conteneurs obtenir de la manière
Struct a(5), b(10);
void (Struct::*one)() = &Struct::One;
void (Struct::*two)() = &Struct::Two;
(a.*one)();
(b.*one)();
(a.*two)();
(b.*two)();
Notez la parenthèse supplémentaire. a.*one()
est insuffisant.
Je ne comprends pas ce que vous demandez. Ou plutôt, je pense que je comprends, je ne sais pas pourquoi vous pensez que les pointeurs vers les fonctions des membres ont quelque chose à voir avec cela? D'après ce que vous décrivez, votre liste se retrouverait avec un tas de valeurs identiques. Vous devez stocker une référence à vos objets A réels d'une manière ou d'une autre, sinon votre liste ne vaudra rien. –
Si je vous comprends bien, il semble que vous vouliez avoir une liste de pointeurs de fonction plutôt que des pointeurs vers des instances d'objets spécifiques. Est-ce ce que vous demandez? – linuxuser27
Pouvez-vous le faire? Oui. Mais c'est sans valeur compte tenu de la situation que vous avez décrite. Toutes les instances de 'A :: doSomething' ont la même adresse. –