2011-09-29 21 views
5

Mi viene detto che non posso usare la parola chiave "this" in una funzione di classe. Vengo da C# e sono abituato a questo funzionamento, ma il compilatore mi dice che può essere utilizzato solo all'interno delle funzioni membro non statiche.Che cos'è una funzione membro non statico?

D3DXVECTOR3 position; 

void Position(D3DXVECTOR3 position) 
{ 
    this.position = position; 
} 
+0

Sei sicuro che ha lavorato in C#? in C#, una "funzione di classe" è chiamata "metodo statico" e non è possibile utilizzare "questo" in entrambi? – muratgu

+0

sì, ho fatto tutto il tempo per fare riferimento a una variabile di classi nel costruttore, oppure il costruttore è diverso? – SirYakalot

+0

Forse dovresti mostrare la classe a cui appartiene questo metodo - questo potrebbe aiutare a chiarire cosa stai facendo – Useless

risposta

11

questo è un puntatore contenente l'indirizzo dell'oggetto.

D3DXVECTOR3 position; 

void YourClassNameHere::Position(D3DXVECTOR3 position) 
{ 
    this->position = position; 
} 

Dovrebbe funzionare.

D3DXVECTOR3 position; 

void YourClassNameHere::Position(D3DXVECTOR3 position) 
{ 
    (*this).position = position; 
} 

Dovrebbe funzionare anche.

+0

@ AndréCaron Heh, non se ne è accorto. Ho modificato per includere le modifiche di MarkB. – Pubby

+0

@ AndréCaron Tranne che non lo sappiamo, perché non ci ha dato alcun contesto. –

14

In C++ è necessario qualificare la funzione Position con il nome della classe:

void YourClassNameHere::Position(D3DXVECTOR3 position)

anche da @ risposta di Pubby8 this è un puntatore, non un riferimento quindi è necessario utilizzare this->position invece (o prendi in considerazione l'uso di nomi di parametri che non fanno ombra ai membri della classe - mi piace usare il trailing _ sui membri della mia classe).

Inoltre, il C++ non passa per riferimento per impostazione predefinita, quindi se D3DXVECTOR3 è un tipo complicato copierete molti dati. Prova a passarlo come const D3DXVECTOR3& position.

3

Non solo è Position una funzione gratuita (non associata a una classe) nel modo in cui è stata scritta, ma this è anche un puntatore, non un riferimento.

D3DXVECTOR3 position; 

void ClassName::Position(D3DXVECTOR3 position) 
{ 
    this->position = position; 
} 

o, se questo dovrebbe essere un costruttore,

ClassName::ClassName(D3DXVECTOR3 p) : position(p) 
{ 
} 
Problemi correlati