Delegado en C++ (o algo así)

En C++, tengo:

//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

In Base1.cpp implemento constructor Base1(string _name) y string getName() como normal, y el 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

Y también debes Base2() constructor que implemento como de costumbre, este es mi printBase1(Base1 b):

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

Entonces, al final, quiero usar printSomething() in Base1 clase, pero no sé cómo pasar el parámetro a la b2.printBase1() in printSomething() como arriba en mi código. hay algo como b2.printBase1(this) en C++? Si no, ¿puedes darme una sugerencia?

preguntado el 12 de junio de 12 a las 17:06

1 Respuestas

Como this es un puntero en C++, debe quitarle la referencia:

b2.printBase1(*this);

Tenga en cuenta que tiene inclusiones circulares, debe eliminar #include "Base2.h" del Base1.h. También busque pasar parámetros por (const), especialmente para los tipos que no son POD; de lo contrario, es posible que no obtenga el comportamiento esperado.

Por ejemplo, su firma es

void printBase1(Base1 b);

cuando lo llama, crea una copia del parámetro en la función y, por lo tanto, opera en una copia. Deberías cambiar esto a:

void printBase1(Base1& b);

or

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

Pase por valor solo cuando esté seguro de que necesitas una copia.

Respondido el 12 de junio de 12 a las 17:06

Si elimino Base2.h, como puedo crear Base2 b2; in printSomething()? Recibí un error :(! - Martín pescador Phuoc

@Kingfisher lo incluye en el archivo cpp, no en el encabezado. - Luciano Grigore

Gracias, pero no cambio void printBase1(Base1 b), todavía obtengo un resultado correcto! ¿tengo suerte? - Martín pescador Phuoc

Hace poco tuve un problema: cannot convert 'this' pointer from 'const Base1' to 'Base1 &'? ¿Cuál es mi problema? Si elimino cada const, funcionará de nuevo!! - Martín pescador Phuoc

@Kingfisher Estás intentando modificar un objeto const, ese es el problema. - Luciano Grigore

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.