2009-07-10 13 views
0

J'essaie de réparer quelque chose dans un code Objective C++ (?!). Je ne connais ni l'une ni l'autre de ces langues, ni aucune des API ou code de base, donc je suis coincé à gauche et à droite.(Obj) C++: Instancier (référence à) classe à partir du modèle, accéder à ses membres?

Dire que j'ai:

Vector<char, sizeof 'a'>& sourceData(); 
sourceData->append('f'); 

Quand je tente de compiler, je reçois:

error: request for member 'append' in 'WebCore::sourceData', which is of non-class type 'WTF::Vector<char, 1ul >&()();

Dans ce cas, Vector est WTF :: Vector (de WebKit ou KDE ou quelque chose) , pas STD :: Vector. append() beaucoup est censé être un membre de la classe générée à partir de ce modèle, comme vu in this documentation. C'est un vecteur. Il prend le type sur lequel le modèle est modélisé. Maintenant, parce que je n'écris jamais de programmes dans les langages de programmation de Real Man, je suis confus au sujet des notations pour les références, les pointeurs et les déréférences et où nous en avons besoin.

Je veux finalement une référence Vector, parce que je veux passer à une autre fonction avec la signature:

void foobar(const Vector<char>& in, Vector<char>& out) 

Je devine que la const dans le foobar() sig est quelque chose que je peux passer sous silence, ce qui signifie 'Ne vous inquiétez pas, ce ne sera pas mutilé si vous le passez ici'.

J'ai aussi essayé d'utiliser .append plutôt que -> parce que les références C++ ne les traitent pas comme si elles n'étaient pas des pointeurs. De toute façon, c'est la même erreur.

Je ne peux pas tout à fait suivre le message d'erreur: il fait sonner comme sourceData est de type WTF: Vector < char, 1ul> &, qui est ce que je veux. Il regarde aussi à partir de ces docs de WTF :: Vector que lorsque vous faites un vecteur de quelque chose, vous obtenez un .append(). Mais je ne connais pas non plus les modèles, donc je ne peux pas vraiment dire que je lis bien.

EDIT:

(Ceci est un long suivi à Pavel Minaev) WOW PROBLÈME MERCI RESOUDRE! En fait, j'écrivais juste un edit à ce post que j'ai mi-compris votre premier point après avoir rencontré une référence sur le web que cette ligne indique au compilateur votre forward déclarant un func appelé sourceData() qui ne prend pas de params et renvoie un vecteur de caractères. donc un "type non-class" signifie dans ce cas un type qui n'est pas une instance d'une classe. J'ai interprété cela comme signifiant que le type n'était pas un 'klass', c'est-à-dire le type de chose que vous attendez que vous puissiez appeler comme .addMethod (functionPointer).

Merci bien! Faire ce que vous suggérez fait ce travail je pense. D'une certaine manière, je l'avais mis dans ma tête (idk d'où) que parce que le func sig était le vecteur &, j'avais besoin de déclarer ceux-ci comme &. Comme une pile ou un problème de passe de tas.

Quoi qu'il en soit, c'était mon vrai problème, parce que j'ai essayé ce que vous aviez suggéré mais cela n'initialise pas la référence. Vous devez appeler explicitement le constructeur, mais quand je mets quelque chose dans les arguments du constructeur à désambiguïser d'être un decl avancé, il a échoué avec une autre erreur à propos de 'temporary's.Donc, dans un sens, je ne comprends toujours pas ce qui se passe ici, mais je vous remercie chaleureusement pour avoir résolu mon problème. Si quelqu'un veut fournir des éclaircissements supplémentaires au profit de moi et des futurs google, ce serait génial.

Répondre

2

Ce:

Vector<char, sizeof 'a'>& sourceData(); 

a déclaré une fonction globale qui ne prend aucun argument et renvoie une référence à Vector. Le nom sourceData est donc de type fonction. Lorsque vous essayez d'accéder à un membre de cela, il se plaint à juste titre que ce n'est pas une classe/struct/union, et operator-> est simplement inapplicable.

Pour créer un objet à la place, vous devez omettre les parenthèses (ils ne sont requises que lorsque vous avez des arguments à passer au constructeur, et doit être omis s'il n'y en a pas):

Vector<char, sizeof 'a'> sourceData; 

Ensuite, vous peut appeler append:

sourceData.append('f'); 

Notez que point est utilisé plutôt que -> parce que vous avez un objet, pas un pointeur vers l'objet.

Vous n'avez rien à faire de spécial pour passer le sourceData à une fonction qui souhaite Vector&. Passez simplement la variable - elle sera automatiquement passée par référence:

foobar(sourceData, targetData); 
0

Tremper vos orteils en C++ n'est jamais très amusant. Dans ce cas, vous avez rencontré quelques erreurs classiques. D'abord, vous voulez créer une instance de Vector sur la pile. Dans ce cas, le () vide est interprété comme une déclaration d'une fonction appelée sourceData qui ne prend aucun paramètre et renvoie une référence à Vector. Le compilateur se plaint que la fonction résultante n'est pas une classe (ce n'est pas le cas). Pour créer une instance de Vector à la place, déclarez l'instance sans le () et supprimez le &. Les parenthèses ne sont requises que si vous passez des arguments au constructeur de l'instance et doivent être omises s'il n'y a pas d'arguments.

Vous voulez

Vector<char, sizeof 'a'> sourceData; 
sourceData.append('f'); 

Vector<char, sizeof 'a'> outData; //if outData is not instantiated already 

foobar(sourceData, outData); 

This article de Wikipedia donne une introduction décente aux références C.

+0

1) Ok, mais quand je crée le vecteur sur la pile, comment puis-je le transmettre par référence? Comme, comment fonctionne ce _actually_. Là, je suis, dans ma pile, bla bla bla, oh voici un appel de fonction, permet de pousser un nouveau cadre sur la pile, enregistrer notre SP, enregistrer nos locos, ok, JMP, nouvelle fonction ... les points de référence. ..où? De retour dans la pileframe englobante? Les références en C++ ressemblent à un classique "Permet de rendre cela plus facile en ajoutant plus de complications!" attitude. Là encore, je ne sais pas vraiment ce qu'ils sont. –

+0

L'un des principaux objectifs des références est de permettre une sémantique de passage par référence sans avoir à utiliser de pointeurs. Contrairement à un pointeur, une référence est comme un alias pour son référent. Il doit être affecté à la création, ne peut pas être nul et ne peut pas être réaffecté pour être une référence à un objet différent. J'ai ajouté un lien vers une bonne introduction à ma réponse. –

+0

La référence pointera en effet vers l'objet original, qui est une variable sur le cadre de la pile supérieure (c'est pourquoi retourner une référence à une variable locale en C++ n'est pas une bonne idée).Ce n'est pas nouveau en C++ - cela a fonctionné de cette façon puisque "passer par référence" est apparu dans les goûts d'Algol et Pascal, bien avant C++. –

Questions connexes