2012-06-12 4 views
2

En C++, j'ai:délégué en C++ (ou quelque chose comme ça)

//Base1.h 
#ifndef BASE1_H 
#define BASE1_H 
#include <iostream> 
#include <string> 
#include "Base2.h" 

using namespace std; 

class Base1{ 
    private: 
     string name; 
    public: 
     Base1(string _name); 
     void printSomething(); 
     string getName(); 
}; 
#endif 

En Base1.cpp je mets en œuvre constructeur Base1(string _name) et string getName() comme d'habitude, et le printSomething():

void Base1::printSomething(){ 
    Base2 b2; 
    // how to pass a parameter in the following code? 
    b2.printBase1(); 
} 

// This is Base2.h 
#ifndef BASE2_H 
#define BASE2_H 

#include <iostream> 
#include <string> 
#include "Base1.h" 

using namespace std; 

class Base2{ 
    public: 
     Base2(); 
     void printBase1(Base1 b); 
}; 
#endif 

Et Base2() constructeur Je mets en œuvre comme d'habitude, c'est mon printBase1(Base1 b):

void Base2::printBase1(Base1 b){ 
    cout << b.getName(); 
} 

Donc, à la fin, je veux utiliser printSomething() dans la classe Base1, mais je ne sais pas comment passer le paramètre au b2.printBase1() en printSomething() comme ci-dessus dans mon code. Y a-t-il quelque chose comme b2.printBase1(this) en C++? Si non, pouvez-vous me donner une suggestion?

Répondre

3

Depuis this est un pointeur en C++, vous devez déréférencer:

b2.printBase1(*this); 

Notez que vous avez circulaire comprend, vous devez supprimer #include "Base2.h" de Base1.h. Jetez également un coup d'œil sur la transmission des paramètres par la référence (const), en particulier pour les types non-POD, sinon vous risquez de ne pas obtenir le comportement attendu.

Par exemple, votre signature est

void printBase1(Base1 b); 

lorsque vous l'appelez, vous créez une copie du paramètre dans la fonction, et fonctionnant ainsi sur une copie. Vous devriez changer cela:

void printBase1(Base1& b); 

ou

void printBase1(const Base1& b); //if you don't change b 

passe par la valeur que lorsque vous êtes certain que vous besoin une copie.

+0

Si je supprime 'Base2.h', comment puis-je créer' Base2 b2; '' dans printSomething() '? J'ai une erreur :(! –

+1

@Kingfisher vous l'incluez dans le fichier cpp, pas l'en-tête –

+0

Merci, mais je ne change pas 'void printBase1 (Base1 b)', je reçois toujours un bon résultat! Suis-je chanceux ? –

Questions connexes