2010-04-06 2 views
1

C++ en Java, nous pouvons le faire:autoreferencing cette classe à utiliser dans un autre pour

public class A{ 

    public static void main(String...str){ 
     B b = new B(); 
     b.doSomething(this); //How I do this in c++ ? the this self reference 
    } 
} 


public class B{ 
    public void doSomething(A a){ 
     //Importat stuff happen here 
    } 
} 

Comment puis-je faire la même chose, mais en C++, je veux dire l'auto référence de A à utiliser la méthode B?

+0

Etes-vous sûr que cela capture votre question?'this' est un mot-clé en C et ça fait exactement ça. – Potatoswatter

+2

Votre code ne sera pas compilé. Vous ne pouvez pas utiliser 'this' d'un contexte statique. –

+0

Oui est correct Je ne peux pas utiliser cela dans un contexte statique, supposons que ce n'est pas statique – atomsfat

Répondre

2

D'abord, dans une méthode statique il n'y a aucun paramètre this. Quoi qu'il en soit, en supposant que le principal() n'est pas statique ici est de savoir comment vous pouvez le faire en C++

class A { 
public: 
    void f() { 
     B* b = new B(); 
     b->doSomething(this); 
    } 

    void g() { 
     // ... 
    }; 
}; 


class B { 
public: 
    void doSomething(A* a) { 
     // You can now access members of a by using the -> operator: 
     a->g(); 
    } 
}; 

En C++ this est un pointeur vers l'objet « courant ». Ainsi, si vous définissez doSomething() comme prenant un pointeur sur A (c'est-à-dire: doSomething(A* a)), vous pourrez recevoir le this de A. L'opérateur -> vous donnera accès aux membres du paramètre a, comme suit: a->g().

Sinon, vous pouvez passer *this et définir doSomething() prendre une référence à A (qui est: doSomething(A& a)):

class A { 
public: 
    void f() { 
     B* b = new B(); 
     b->doSomething(*this); 
    } 

    void g() { 
     // ... 
    }; 
}; 


class B { 
public: 
    void doSomething(A& a) { 
     // You can now access members of a by using the . operator: 
     a.g(); 
    } 
}; 

Pour accéder aux membres d'une référence, vous devez utiliser l'opérateur . (point): a.g() .

1

this est un mot clé en C++ pointant vers l'objet actuel. Peut-être que vous voulez *this qui est une référence à l'objet actuel. Je dirais que c'est un anachronisme; les références sont plus courantes que les pointeurs dans le code C++ le plus moderne et tout fonctionnerait plutôt bien si this était défini comme référence.

Mais le dérangement est faible.

+1

@Potatocorn: Non apparenté mais voir cette question sur pourquoi 'ceci' est un pointeur et non une référence: http://stackoverflow.com/questions/ 645994/pourquoi-ce-est-un-pointeur-et-non-une-référence – Naveen

1

C++ a this mot-clé. Mais c'est un pointeur et non une référence. Dans votre cas, vous devez changer la signature de doSomething en classe B à doSomething(A* pA) et de l'utiliser comme b.doSomething(this);

0

Java est un compilateur "moderne". Les modules sont correctement compilés, y compris leurs références croisées. C++ est un "vieux" compilateur, assez intelligent pour tout faire en un seul passage sur le code source. Cependant, cela implique qu'il vous laissera référencer A de B, et même B de A, à condition que vous n'utilisiez que des pointeurs. En fait, quand C++ compile A, il ne sait pas que vous avez une classe B. D'accord, nous pouvons résoudre ce problème en précédant la déclaration de A avec:

class B; 

ce qui équivaut à dire au compilateur: D'accord, il y a une classe B un autre endroit. Fantastique. Maintenant vous pouvez mettre des paramètres de type "B * b", car un pointeur n'est qu'un pointeur (4 octets dans les architectures 32bits ...). Cependant, vous ne serez pas capable de compiler quelque chose comme, disons, un paramètre par valeur "B b", car entre autres, le compilateur doit connaître la taille de la classe B, car il n'a même pas compilé encore.

Il y a d'autres considérations au sujet de votre code, spécialement sur le passage ce, (ce est un pointeur), mais ces aspects ont été encore répondu.

Questions connexes