“ce” pointeur en C (pas C++)
Je suis en train de créer une pile en C pour le fun, et est venu avec l'idée d'utiliser la structure pour représenter la pile. Puis-je ajouter des pointeurs de fonction de la structure de push() et pop ().
Pour l'instant, tout est bon il me semble, mais, pour la mise en œuvre de la fonction push() et pop() fonctions dont j'ai besoin pour se référer à *ce en quelque sorte. Comment peut (peuvent?) être fait?
C'est mon struct
struct Stack {
int *data;
int current_size;
int max_size;
int (*push)(int);
int (*pop)();
};
Et comme un exemple ici de pousser
int push(int val) {
if(current_size == max_size -1)
return 0;
data[current_size] = val;
current_size++;
return 1;
}
Comme vous pouvez l'imaginer, le compilateur n'a aucune idée de ce que current_size
est, comme il le ferait s'attendre à quelque chose comme stack->current_size
.
Est-ce possible de surmonter en quelque sorte?
Pour essayer d'obtenir une réponse si c'est possible de faire appel à une pile de ce type comme ceci:
stack->push(10);
. Maintenant, si la réponse n'est pas donnée ici, je peux être assez confiant qu'elle est en effet impossible.OriginalL'auteur foo | 2010-12-14
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas implicite
this
en C. le Rendre explicite:Vous devrez passer le pointeur de la structure dans chaque appel à
push
et des méthodes similaires.C'est essentiellement ce que le compilateur C++ est fait pour vous lorsque vous définissez
Stack
en tant que classe etpush
et al en tant que méthodes.C'est l'idée, mais en utilisant
this
comme une variable est maladroite, si quelqu'un essaie d'inclure votre C dans un programme C++.Les bons points; j'ai édité la réponse. Merci.
Il existe de nombreuses raisons autres que
this
pourquoi y compris le code C dans un fichier source C++ n'est pas valable et pourrait conduire à des bugs majeurs. Il suffit de ne pas le faire. Sithis
de sens que comme un nom de variable (comme ici), l'utiliser.Il y a encore un point à mettre les pointeurs de fonction dans la structure. Vous ne devriez jamais déclarer des fonctions externes avec de tels noms génériques comme
push
etpop
, surtout si le code peut éventuellement faire partie d'une bibliothèque. Donc, si vous voulez soit besoin de les nommer quelque chose commefoo_push
etfoo_pop
, ou vous pouvez les masquer commestatic
dans le fichier d'implémentation de la pile et ontfoo_allocstack
retour d'une pile d'objet avec la fonction pointeurs pointent vers ces fonctions statiques. La dernière solution a plus de surcharge, mais il pourrait être utile.OriginalL'auteur NPE
L'approche typique dans C est pour avoir des fonctions attendre
this
en tant que premier paramètre.Cela présente l'avantage que, sauf si vous avez besoin de polymorphisme, vous n'avez pas besoin de mettre les fonctions dans la pile, parce que vous pourriez juste l'appeler
push(stack, 10)
au lieu destack->push(stack,10)
.push(stack, 10)
est la chose la plus sensée à faire en C.OriginalL'auteur Victor Nicollet
C ne fonctionne pas comme ça. Ce n'est pas un langage orienté objet. Les fonctions permettant de manipuler des structures de données ont besoin de prendre un pointeur vers la structure comme un argument.
OriginalL'auteur Tyler Eaves
Votre pointeurs de fonction ne sont pas des méthodes de sorte qu'ils n'ont pas de toutes les informations au sujet de l'objet appelant. La seule façon de faire ce que vous voulez, c'est de passer un pointeur vers l'objet, ou de faire ce pointeur global (le dernier n'est pas recommandé).
OriginalL'auteur Niki Yoshiuchi
Depuis votre allez avoir un seul Pile structure (que vous avez nommé pile, apparemment), on pourrait le définir comme une variable globale. Cela permettrait pop/push to reportez-vous à la pile variable directement.
Vous ferais quelque chose comme:
de la pile.current_size += 4;
ou utiliser le -> opérateur si vous décidez de déclarer pile comme un pointeur de la mémoire de Pile.
OriginalL'auteur karlphillip
Évidemment, vous pouvez avoir une Pile * membre de la struct et puis il suffit de l'initialiser avec l'adresse de la structure avant d'utiliser les pointeurs de fonction. Puis faire de la Pile * un paramètre sur les pointeurs de fonction.
Cela semble évident. N'est pas chose au sujet de qui doit de l'essayer. Merci
Je me demandais si différents utilisateurs sur ce site voir les questions avant les autres. Je ne vois pas comment une question de ce genre peut obtenir quatre réponses en moins d'une minute.
avec cette solution, vous avez toujours le même problème exactement les fonctions push et pop point de ne pas savoir quelque chose au sujet de l'objet appelant.
Il n'y a actuellement aucune bonne raison d'avoir de la Pile * en tant que membre de la structure. La structure de l'adresse doit être passé dans les fonctions qui sont appelées les pointeurs.
OriginalL'auteur ThomasMcLeod