2010-09-29 4 views
1

Bonjour J'utilise une bibliothèque tierce dans mon application iPhone qui utilise C++. L'une des méthodes que je dois utiliser renvoie un pointeur vers un pointeur d'une classe. comme suit. Je peux appeler avec succès la méthode et renvoyer la valeur dans un pointeur vers un pointeur comme cela;Accès à un pointeur en C++

classAttributes **attributes = cPPClass->getAttributes(); 

mais je ne peux pas sembler accéder à l'une des méthodes de la classe, par exemple, je sais que la classe a une fonction appelée getName(); mais quand j'essaie de l'appeler, je reçois des erreurs.

attributes->getName(); 'Request for member 'getName' in *attributes'; which is of non-class type 'attributes*'' 

J'ai fait quelques googler et trouvé quelques trucs que dit accéder à une adresse de pointeur de pointeur utilisez le format

&(*attributes)->getName(); 'invalid uses of incomplete type 'struct attributes' 

Toute aide serait grandement appréciée. Merci.

+2

Savez-vous ce que font les opérateurs '->', '*', et '&'? Sinon, vous devez trouver [un bon livre C++ d'introduction] (http: // stackoverflow.com/questions/388242/the-definitive-C++ - book-guide-and-list) et apprenez ce qu'ils sont. Vous ne pouvez pas trébucher à travers la programmation C++ en essayant des combinaisons aléatoires d'opérateurs. –

Répondre

2

'invalid uses of incomplete type 'struct attributes' indique que vous avez besoin de #include le fichier d'en-tête correspondant. Il est seulement déclaré à ce stade dans votre code.

1

Sans en savoir plus sur la bibliothèque, c'est difficile à dire. Mais il pourrait être de retour un tableau d'éléments:

attributes[0]->getName();  
attributes[1]->getName(); 

La partie douteuse de mon estimation, cependant, est qu'il n'y a aucun moyen évident de savoir combien d'articles il y a.

+1

Notez que 'attributes [0] -> getName()' est équivalent à '(* attributs) -> getName()'. –

+0

@Kristopher: Oui, je le sais. Je vais essayer de clarifier ma signification. J'ai ajouté une autre entrée pour montrer plus d'utilisation "en forme de tableau" (et une mise en garde qui indique que je ne saurais pas combien d'éléments il y a). Merci. –

1

Considérons d'abord ce que vous feriez si la fonction renvoyait un pointeur vers une variable classAttributes. Dans ce cas, vous simplement faire:

attributes->getName(); 

Comme il est un pointeur vers un pointeur, vous devez d'abord déréférencer puis utilisez l'opérateur ->:

(*attributes)->getName(); 

Si cela ne fonctionne pas, il peut s'agir d'un problème causé par la non-implémentation de la fonction ou par l'héritage.

+1

Correction de la mise en forme pour vous, j'espère que cela ne vous dérange pas. – You

+0

Salut les gars, j'ai essayé ces deux suggestions (*) et [0] mais j'ai toujours la même erreur :: utilisation invalide de type incomplet –

+0

On dirait qu'Alex pourrait être correct alors. –

1

Ce que vous voulez probablement est un classAttributes *. Puisque vous avez un classAttribues **, vous voulez le déréférencer une fois pour accéder à classAttributes *.

(*attributes) 

De là, vous pouvez probablement appeler les membres de la classe.

classAttributes **attributesArray = cPPClass->getAttributes(); 
classAttributes *attributesObject(*attributesArray); 
attributesObject->getName(); 
0

Par le regard de celui-ci, vous auriez à faire est probablement de cette façon (pas de esperluette):

(*attributes)->getName(); 

En effet, il déréférencement une fois vous donnera un pointeur vers une structure, sur laquelle vous pouvez ensuite utiliser l'opérateur ->. Qu'est-ce qui se passe quand vous faites &(*attributes) est que vous déréférencer le pointeur, puis obtenir l'adresse de l'objet que vous avez - en fait en fait un non-op.