Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C++] Puntatore e this

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]puntatore e this

    CIao.
    Ho la seguente funzione:
    codice:
    dichiarazione:
    if(! StackIfc.top()->GetData(localName, m_strCurrStr, m_nPos, pOldIfc))
    
    implementazione:
    
    bool CWallStandardCaseIfc::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;
    		pIfcValue = this;
    		return false;
    	}
    	if(tag.compare(L"Name") == 0 )
    		m_Name = value; 
    	if(tag.compare(L"Description") == 0 )
    		m_Description = value; 
    	
    	if(tag.compare(L"IfcProductDefinitionShape") == 0)
    		m_ProductDefinitionShape =(CProductDefinitionShapeIfc*) pIfcValue;
    
    	
    }
    ora , il puntatore quando esce da :
    codice:
    if(! StackIfc.top()->GetData(localName, m_strCurrStr, m_nPos, pOldIfc))
    richiamata da una altra classe dopo essersi settato a this:
    codice:
    if(tag.compare(getType())==0)
    {
    	m_bHasData = false;
    	pIfcValue = this;//setto a this dall' interno della classe
    	return false;
    }


    il puntatore pOldIfc(checorrisponde a pIfcValue) perde i valori , e non riesco a capire perchè.
    Non è un puntatore?
    grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Perdi il valore perché il puntatore modificato è interno alla funzione e quando quest'ultima esce viene distrutto.

    Per modificare il puntatore esterno, o ne passi il reference:
    codice:
    bool CWallStandardCaseIfc::GetData(wstring tag, wstring value, int pos, CBaseIfc*& pIfcValue)
    (lasciando inalterato il resto del codice); o ne passi il puntore:
    codice:
    bool CWallStandardCaseIfc::GetData(wstring tag, wstring value, int pos, CBaseIfc** pIfcValue)
    (modificando dove serve per dereferenziarlo).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Ciao Shodan.
    Io hofatto come hai detto e ci sono riuscito pero'non ho capito bene il perchè , adesso so che devo passare il puntore ,in questo caso , non riesco bene a visualizzare il perchè nella testa.
    Perchè perdo il puntatore?
    Mi aiuti?
    Grazie .
    CIao.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Prendiamo come esempio la classica swap.
    Se scrivi:
    codice:
    void swap(int a,int b) {
    	int c=a;
    	a=b;
    	b=c;
    }
    
    int va1=10, val2 = 20;
    swap(val1,val2);
    noterai che all'uscita della funzione i valori di val1 e val2 sono inalterati.
    Questo perché a e b sono locali alla funzione e quando la funzione esce, sono distrutti.
    Per scambiare i valori devi usare puntatori o reference (tralascio questi ultimi visto che non li usi).

    codice:
    void swap(int* a,int* b) {
    	int c=*a;
    	*a=*b;
    	*b=c;
    }
    
    int va1=10, val2 = 20;
    swap(&val1,&val2);
    All'uscita della funzione i valori sono scambiati, ma a e b sono sempre locali alla funzione e quando la funzione esce sono distrutti.
    Però "puntano" a variabili esterne, quindi dereferenziandoli possono scambiare il valore delle variabili esterne.

    Lo stesso vale per i doppi puntatori.
    codice:
    void swap(int** a,int** b) {
    	int* c = *a;
    	*a = *b;
    	*b = c;
    }
    
    int va1=10, val2 = 20;
    
    int *pval1 = &val1;
    int *pval2 = &val2;
    
    swap(&pval1,&pval2);
    All'uscita della funzione, vedrai che val1 e val2 hanno il valore inalterato, pval1 e pval2 sono scambiati, ma a e b sono sempre locali alla funzione e quando la funzione esce sono distrutti.
    Da questo si capisce che se vuoi modificare un qualcosa di esterno a una funzione, ne devi passare il puntatore e poi dereferenziarlo di un livello.

    Nel tuo caso, pIfcValue è un doppio puntatore interno alla funzione e quando la funzione esce viene distrutto.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ho capito , ma su quest altro post che tratta le stesse cose ma con ottica differente non ho capito:
    http://forum.html.it/forum/showthrea...readid=1374431

    scusa se rompo , ma giuro che dopo per un po non ti chiedo piu niente (scherzo)

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.