Objectif C fait entier de pointeur sans un casting de passage d'objets comme arguments
Je suis en train de faire blackjack en objective C, et éprouve de la difficulté à passer les objets autour. Ma Main classe prend un deck et tire les cartes, de les ajouter à un tableau.
Voici la Main de méthodes:
- (id)init : (Deck*) deck
{
[self draw: deck];
[self draw: deck];
return self;
}
- (void)draw: (Deck*)deck;
{
Card* C= [deck drawFromDeck];
[cards addObject: C];
}
Voici la problématique de la partie principale:
Deck* deck=[[Deck alloc] init];
Hand* hand=[[Hand alloc] init: deck ];
La deuxième ligne de qui obtient le "nombre entier à partir de pointeur sans un casting d'erreur". Chaque fois que j'exécute le code, la main n'a jamais de cartes, car il n'y a pas de pont à en tirer (je pense 🙂 ). Ai-je besoin de passer ou analyser le Pont différemment? (si vous avez besoin de moi pour poster tout le code, il suffit de demander)
Merci les gars!! 😀
Modifier avec ce qui concerne à la générosité: Bien que je ne crois que la réponse que j'ai accepté, c'est bien expliqué et , cette question a obtenu une moyenne de plus de 17 vues un jour pour la dernière année et demie. Cela signifie que cette question est probablement la première expérience de beaucoup de gens ont avec stackoverflow, et l'amélioration de l', il ne sera pas seulement de nous montrer sous un meilleur jour, il sera sans doute économiser beaucoup de temps. Alors qu'il a les bonnes réponses, maintenant, je veux faire en sorte qu'il soit aussi parfait que possible, en particulier parce que nous ne savons pas vraiment combien de personnes ont été en mesure de suivre et de résoudre leur problème.
Aller de l'avant et de présenter des modifications à la les réponses existantes ou ajouter vos propres. (Mods, tu penses que ce serait un bon candidat pour le wiki de la communauté?)
En particulier, il serait bon de voir le @interface de Pont et de la Main, je pense.
Je soupçonne que l'init: méthode n'a pas été déclarées dans l'interface. Aussi, la convention commune, CrazyJugglerDrummer, est d'inclure l'étiquette pour l'argument suivant dans votre nom de la méthode - par exemple: initWithDeck:(Pont*) le pont
OriginalL'auteur Gordon Gustafson | 2009-04-12
Vous devez vous connecter pour publier un commentaire.
Le problème, basée sur le code que vous avez posté ci-dessous, que vous disposez de deux méthodes avec le même nom mais dont les paramètres ne correspondent pas, à savoir
- (id)init: (Deck*)deck
et- (id)init: (int)newvalue
.Normalement, ce n'est pas un problème, mais dans ce cas, les types sont structurellement différents, un pointeur et un entier (int). Le compilateur ne peut distinguer que vous voulez dire en fonction du type de récepteur, mais cela ne fonctionne que quand elle a son type statique. Par exemple, si vous avez eu:
Il allait arrêter de vous donner un avertissement. Ce qui est très inhabituel code - alloc et init vont presque toujours sur la même ligne.
Depuis
alloc
retourne unid
, et pas unHand
il ne sait pas que l'init d'appel dans[[Hand alloc] init:deck]
est unHand
, et pas unCard
. Voir Apple Docs sur le typage statique pour plus d'informations à ce sujet.Le plus facile (et raisonnable) de la solution est de renommer les méthodes pour indiquer le type de l'argument. Par exemple, vous pouvez utiliser
initWithCardValue:
etinitWithDeck:
.EDIT: Aussi, oui, écouter les suggestions des autres postes sur le bon comportement à l'intérieur de la méthode init. (Il n'est pas causant de l'avertissement, mais il peut être la cause de l'erreur de segmentation.)
OriginalL'auteur Jesse Rusak
Comme Phil Nash a dit dans son commentaire sur votre question, assurez-vous que vous avez importé les en-têtes à la fois la Main et le Pont dans votre fichier principal. Qui devrait arrêter l'avertissement (et c'était un avertissement, pas une erreur).
Dans votre
init
méthode(s), n'oubliez pas d'appeler[super init]
, vérifiez qu'il n'a pas de retournil
, et d'initialiser l'objet qu'il a fait retour. La façon la plus courante de le faire est:De déclarer des variables pour les tableaux n'est pas suffisante, vous devez également créer les tableaux et les mettre dans les variables. Seulement alors pouvez-vous mettre des choses dans les tableaux.
OriginalL'auteur Peter Hosey
Avez-vous appeler
[super init]
dans votre Maininit:
méthode?Aussi, vous êtes à l'ajout de Cartes à cartes de tableau; c'est qu'en étant correctement configuré?
OriginalL'auteur