Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]copia e puntatori

    ciao.
    ho un insieme di classi che eredintano da una classe base che hanno questa funzione(l'implementazione della funzione varia a secondo della classe:
    codice:
    bool CProductDefinitionShapeIfc::GetData(wstring tag, wstring value, int pos, CBaseIfc** pIfcValue)
    {
    	if(!m_bHasData)
    		return true;
    	
    	//il tag di apertura è uguale al tag di chiusura = fine classe
    	if(tag.compare(getType())==0)
    	{
    		m_bHasData = false;
    		return false;
    	}
    	if(tag.compare(L"Name") == 0 && m_Name.compare(L"")==0)
    		m_Name = value; 
    	else if(tag.compare(L"Description") == 0)
    		m_Description = value; 
    	if(tag.compare(L"IfcShapeRepresentation") == 0)
    		m_ShapeRepresentation[pos] =(CShapeRepresentation*) pIfcValue;
    	return true;
    	
    };
    ho un ciclo che scorre un xml con sax e mi ritorna i valori a questo punto chiamo la gedata:
    codice:
    for(int i = 0 ; to fine xml)
       ClasseCorrente->GetData(wstring tag, wstring value, int pos, CBaseIfc** pIfcValue)
    in pratica in questo modo carico le mie classi coi dati.
    quando ho completato di caricare la classe coi dati metto la classe in una mappa con un indice univoco per dopo:

    codice:
    for(int i = 0 ; to fine xml)
       ClasseCorrente->GetData(wstring tag, wstring value, int pos, CBaseIfc** pIfcValue)
       mappa_Oggetti[indiceunivoco]=ClasseCorrente
    Nell'applicazione ho un insieme di tag con un ref o un id all id corrispondono i ref e viceversa.
    quando trovo un indice univoco ref estraggo dalla mappa l'indirizzo dell' id relazionato e vorrei assegnare al ref un altro indirizzo , quello della classe relazionata in modo da andare a "riempire" il ref con l'id , vorrei utilizzare se possibile un sistema con gli indirizzi e non i valori.
    magari con un indirizzo ad un indirizzo **?ma non ci salto fuori.
    E' possibile?
    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    in pratica , spiego la soluzione che ho pensato:
    se uso un puntatore di puntatore:
    **ppData
    posso inserire il puntatore del dato nel secondo indirizzo di ppData(*ppData=indirizzo_oggetto) e quando rimpiazzo l'indirizzo dell' oggetto con uno letto dalla mappa faccio semplicemente:
    *ppData=nuovo_indirizzo_oggetto mentre **ppData mantiene il primo riferimento all'oggetto che lo ha creato.
    Ilproblema è questo:
    in questa funzione(che è quella giusta , ho visto appena adesso che ho sbagliato a postare):
    codice:
    bool CRelContainedInSpatialStructure::GetData(wstring tag, wstring value, int pos, CBaseIfc** pIfcValue)
    {
    			
    	//il tag di apertura è uguale al tag di chiusura = fine classe
    	if(tag.compare(getType())==0)
    	{
    		m_bHasData = false;
    		
    		return false;
    	}
    	
    	//il tag di apertura è uguale al tag di chiusura = fine classe
    	/*if(!m_bHasData)
    		return true;*/
    
    	if(tag.compare(L"Name") == 0)
    		m_Name = value; 
    	else if(tag.compare(L"Description") == 0)
    		m_Description = value; 
    	
    
    	if(tag.compare(L"IfcWallStandardCase") == 0){
    	
    		CWallStandardCaseIfc* pwall = (CWallStandardCaseIfc*) *pIfcValue;
    		*pIfcValue = pwall;
    		m_wall = pwall;
    ----->//  dove m_wall è un puntatore di puntatore
    	}
    	if(tag.compare(L"IfcWindow") == 0)
    	{
    		m_pCIfcWindows[pos] =(CWindowIfc*) *pIfcValue;
    		*pIfcValue = m_pCIfcWindows[pos] ;
    	}
    	
    };
    come gestisco il primo puntatore? che non deve puntare all' indirizzo dell' oggetto dati , bensi' è un metodo per mantenere il riferimento a m_wall.
    In pratica io voglio ritrovarmi in **m_wall il riferimento cambiato o che puo cambiare (dalle mappe) e in *m_wall l'indirizzo di m_Wall che ho salvato.
    Scusate ma faccio un po di confusione, mi aiutate?
    grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.