2009-09-04 6 views
0

Ok donc j'ai struct comme çaObtenir un pointeur à la structure dans une carte C++

typedef struct 
{ 
float x; 
float y; 
char name[]; 
} pTip; 

Et un autre struc

typdef struct 
{ 
    float xx; 
    float yy; 
    pTip *tip; 
}finalTip; 

créer et alimenter un map<string, pTip> Cartes

Cela fonctionne très bien . Je suis maintenant en train de générer vecteur de finalTips

je:

map<string, pTip>::const_iterator iter = maps.find(p_name); 

Il fonctionne très bien mon iterator a maintenant ce que je dois et je peux extraire des informations avec

(iter->second).x 

Mais je vouloir maintenant utiliser cet itérateur enregistrer dans mon finalTip struc obj final Donc j'ai essayé:

finalTip final; 
final.tip = iter->second; 

Et pour ce cas, j'obtiens l'erreur:

erreur: ne peut pas convertir 'const PTIP' à 'PTIP *' dans l'attribution

Je fixé par:

*final.tip = iter->second; 

était-ce correctif correct ou est-ce que je le fais mal. Cela semble fonctionner mais je veux m'assurer que je le fais bien

+0

Vous devez expliquer plus clairement ce que vous essayez d'accomplir ici. Par exemple, le nom de finalTip est très curieux. Aussi pourquoi garder tous ces conseils dans une liste si vous voulez seulement lire l'un d'entre eux? Copier la construction ("* final.tip = iter-> second;") est aussi une chose curieuse à faire en général. –

Répondre

4

Vous voulez

final.tip = &iter->second; 

Depuis iter est un map<string, pTip> iterator, iter->second est une référence à PTIP. Prenez son adresse avec & pour obtenir un pointeur.

Malheureusement, puisque vous avez un const_iterator, &iter->second sera un (const pTip *)

Donc, soit obtenir un itérateur non-const, ou faire le membre .tip un const pTip *, ou si vous êtes désespéré, rejetterai la const:

final.tip = const_cast<pTip*>(&iter->second); 

Note finale: vous pouvez préférer pTip const* à const pTip * - ils veulent dire la même chose.

+0

Cela ne correspond pas au fait qu'il a un tampon extensible à la fin de pTip. Je pense qu'il veut dire que pTip est un pointeur et par conséquent que les éléments cartographiques sont des pointeurs. – Omnifarious

+0

C'est confus, je l'admets, mais Map sera en fait implémenté comme une structure de données de nœud quelconque. Les itérateurs ne seront pas invalidés par les opérations sur l'arborescence (autre que la suppression de l'élément). Il est donc légitime de garder un pointeur sur l'élément mappé (sans avoir besoin de la carte pour contenir des pointeurs vers des objets autonomes sur le tas). Ceci est contraire à dire, en prenant l'adresse d'un itérateur vectoriel, où le redimensionnement invaliderait le pointeur. –

+0

@ wrang-wang - Je ne trouve pas cela déroutant. Je me suis dit que le pointeur que vous aviez indiquait toujours quelque chose de valable après que l'itérateur soit parti, bien que je pense que se fier au genre de comportement est un peu précaire. Ma plainte est que la structure de pTip ne semble pas devoir être stockée en valeur du tout. Il a ce qui ressemble à un tampon extensible à la fin. – Omnifarious

0

Aviez-vous initialisé final.tip pour pointer vers un bout "vide" ...? Sinon, vous copiez dans la mémoire non initialisée. Peut-être que vous voulez dire final.tip = new pTip(iter->second), c'est-à-dire, un constructeur de copie dans le stockage nouvellement alloué? Faites également attention à cette construction char name[] - sans une longueur, un constructeur de copie généré automatiquement peut être en difficulté à faire les choses correctement, vous devrez donc coder explicitement le ctor de copie dont vous avez besoin!

+0

la construction 'char name []' serait une chose non-standard, donc vous avez raison de faire attention à cela (MSC ne générera pas automatiquement un ctor ou un opérateur d'affectation pour de telles structures). –

+0

en particulier, s'il le garde dans une carte, alors je peux seulement voir l'échec en sortir. appeler l'insert et ensuite quand la carte le copie, ne coupera-t-il pas les parties que 'name' est censé recouvrir? Je ne sais pas comment MSVC pourrait gérer cela. –

0

Je suis surpris que cela fonctionne. Sauf si vous avez un code qui initialise final.tip que vous avez montré ici, cela écrirait la valeur de iter-> second dans un endroit aléatoire de la mémoire, ce qui peut conduire à des résultats imprévisibles.

0

Ce code:

*final.tip = iter->second 

est tout à fait susceptible de provoquer éventuellement votre programme pour commencer à se comporter de façon erratique. Vous piétinez sur la mémoire. final.tip est un pointeur non initialisé et peut pointer n'importe où. Vous êtes en train de provoquer l'écrasement du contenu de iter-> second. Je ne suis pas complètement sûr de ce que vous voulez accomplir ici. La réponse à votre question dépend fortement de cela.

La construction char name[] dans pTip est également intéressante et problématique. Il semble que vous essayez d'utiliser un tampon extensible à la fin de votre structure, ce qui est une technique C commune. Il est peu probable que cela fonctionne bien lorsqu'il est mélangé avec des conteneurs STL. Je soupçonne que vous avez l'intention que votre carte soit mappée à des pointeurs au lieu de copier des structures.Je pense que vous vouliez dire quelque chose comme:

typedef struct 
{ 
float x; 
float y; 
char name[]; 
} *pTip;