PDA

Visualizza la versione completa : [C++] Passaggio variabili come "reference"


giuseppe500
15-09-2011, 21:32
ciao.
ho il seguente header:


#pragma once
#include "Structs.h"
class CTriangle
{
public:
CTriangle(void);
~CTriangle(void);
//inserisco il vertice ee i suoi attributi
void InsertVertex(const POSITION& vertexes, const NORMAL& normals, const TEXCOORD& UV, const long& nIndex);
private:
//flag che mi dice se il winding order del triangolo è orario o antiorario
bool bIsClocwise;
POSITION& m_Position;
NORMAL& m_Normal;
TEXCOORD& m_UV;

};

e il seguente cpp:


#include "Triangle.h"

CTriangle::CTriangle(void)
{
m_Position = 0;
m_Normal = 0;
m_UV = 0;
}

CTriangle::~CTriangle(void)
{
}

void CTriangle::InsertVertex(const POSITION& vertexes, const NORMAL& normals, const TEXCOORD& UV, const long& nIndex)
{



}

1)come è rappresentabile(come posso capirla) una variabile passata per reference all' interno della sua funzione e eventualmente come variabile membro.
2)e per gli array passati per reference? ad esempio nel codice sotto avrei voluto passare vertexes o normals come array di tre elementi(POSITION[3] o NORMAL[3]), come posso fare?
3)si puo utilizzare un reference come variabile membro?
4)come la inizializzo se variabile membro
5)come posso passare da reference a puntatore?
grazie.

MisterBean
15-09-2011, 22:39
Una variabile passata per reference evita che il parametro venga copiato all'interno del frame della funzione al momento della chiamata.
1) Non capisco cosa intendi con "rappresentare". Se intendi accedere a quella variabile, basta chiamarla col suo nome, senza asterisco come invece si fa con i puntatori.
2) Non conviene passare gli array per reference, perchè il nome di un array è assimilabile a un puntatore al tipo di dato presente nell'array, è più comodo fare:

CTriangle(const POSITION *vertexes, /* altri parametri */);
In questo modo passi un array (monodimensionale). In questo caso è ovvio, ma negli altri devi sapere già il numero di elementi dell'array, o fartelo passare come parametro, altrimenti rischi un segmentation fault.
3) Puoi impostare una variabile membro mettendola uguale a un reference che ti viene passato. Facendo così:

variabileMembro = myReference;
attenzione che non viene copiato l'indirizzo dell'oggetto rappresentato da myReference, ma viene effettuata una deep-copy dell'oggetto, che diventerà la tua variabileMembro.
4) Vedi risposta sopra.
5) Usando l'operatore "&" per trovarne l'indirizzo, lo puoi assegnare a una variabile puntatore.

MItaly
15-09-2011, 23:31
Originariamente inviato da giuseppe500
1)come è rappresentabile(come posso capirla) una variabile passata per reference all' interno della sua funzione e eventualmente come variabile membro.
Un reference è un alias per la variabile a cui è stato inizializzato. Internamente è implementato come un puntatore, ma di fatto è più comodo pensarlo in questa maniera (ed in effetti nello standard è definito così). Una volta inizializzato (cosa che si può fare solo al momento della sua creazione) diventa a tutti gli effetti "un altro nome" per l'oggetto a cui è stato inizializzato, e non è rilocabile.


2)e per gli array passati per reference? ad esempio nel codice sotto avrei voluto passare vertexes o normals come array di tre elementi(POSITION[3] o NORMAL[3]), come posso fare?


POSITION (& NomeParametro)[3]
ma in genere non si usa: gli array decadono in puntatore nel passaggio a funzione, per cui non ci sono vantaggi in termini di prestazioni ad usare i reference; piuttosto, si usano quando si vuole forzare il passaggio di un array delle dimensioni specificate.


3)si puo utilizzare un reference come variabile membro?
Sì, avendo cura però di inizializzarlo a qualcosa che continui ad esistere per tutta l'esistenza dell'oggetto.


4)come la inizializzo se variabile membro
Come si inizializza* qualunque cosa dal costruttore: tramite la sintassi dell'initialization list:


class UnaClasse
{
int & unReference;
public:
UnaClasse(int & UnReference)
: unReference(UnReference) // <-- questa è l'initialization list
{
}
};


* nota che quando fai degli assegnamenti dentro il costruttore non stai inizializzando: i membri non-POD della classe vengono inizializzati con il costruttore di default, e quindi ci vai sopra con l'operatore di assegnamento. Al contrario, usando la sintassi dell'initialization list puoi effettuare delle vere inizializzazioni (per cui puoi costruire oggetti-membro con costruttori parametrici).


5)come posso passare da reference a puntatore?

Dal momento che un reference è un alias all'oggetto, esattamente come faresti con l'oggetto, ovvero con l'operatore unario &.

Loading