una que programacion programa lenguaje headers encabezados ejemplos crear cabeceras cabecera archivos c++ file class header methods

que - c++ método de adición a la clase definida en el archivo de encabezado



headers en c (8)

Después de pensarlo, podría hacer algo terrible: encontrar alguna función en CFun que tenga un tipo de devolución que desee, y solo mencionar una vez en todo el encabezado. Digamos void GoodBye() .

Ahora crea un archivo CFunWrapper.hpp con este contenido:

#define GoodBye() Hello() { cout << "hello" << endl; } void GoodBye() #include "CFun.hpp" #undef GoodBye

Entonces solo incluya CFunWrapper.hpp en lugar de CFun.hpp.

Pero no hagas esto, a menos que haya alguna razón realmente buena para hacerlo. Es extremadamente propenso a romperse, y puede que no sea posible, dependiendo del contenido de CFun.hpp.

Me pregunto si es posible agregar métodos en el programa principal a una clase existente definida en el archivo de encabezado. Por ejemplo: Hay una class CFun definida en el archivo CFun.hpp , pero en nuestro party.cpp queremos agregar un método void hello() {cout << "hello" << endl;}; sin editar CFun.hpp

Obviamente (desafortunadamente) construcción:

#include "CFun.hpp" class CFun { public: void hello() {cout << "hello" << endl;}; };

no funciona devolver un error Multiple declaration for ''CFun''

¿Es posible hacer que funcione sin herencia de clase?


El análogo más cercano a ese tipo de construcción (agregando funcionalidad a clases predefinidas) en C ++ es el patrón Decorator. No es exactamente lo que busca, pero puede permitirle hacer lo que necesita.


No que yo sepa. Aunque, podrías hacer algún tipo de jurado y hacer una solución de espacio de nombres.


No, eso no es posible. Solo puede haber una definición de cualquier clase en particular, y tiene que ser una definición completa, lo que significa que no puede tener definiciones parciales en lugares diferentes, agregando miembros a la clase.

Si necesita agregar una función de miembro a una clase, entonces tiene que cambiar la definición de la clase (editar CFun.hpp), o derivar una nueva clase de CFun y poner allí hello() .


No, pero podría agregar un método que tome una referencia / puntero a una clase de CFun; simplemente no tendrá acceso a datos privados:

void Hello(CFun &fun) { cout << "hello" << endl; }

Esto es probablemente lo mejor que podrás hacer. Como lo señaló litb, esta función debe estar en el mismo espacio de nombres que CFun. Afortunadamente, los espacios de nombres, a diferencia de las clases, se pueden agregar en varios lugares.


class Party : class CFun

(su party.cpp)

hereda elementos de CFun, incluida la función hello ().

Asi que...

Party p; p.hello();

¿No?


Esto parece un caso de uso obvio para la herencia. Definir una nueva clase:

#include "CFun.hpp" class CFun2 : public CFun { public: void hello() {cout << "hello" << endl;}; };

Luego use CFun2 lugar de CFun en su código fuente.


Puede redefinir la clase de esta manera:

#define CFun CLessFun #include "CFun.hpp" #undef CFun class CFun : CLessFun { public: void hello() {cout << "hello" << endl;}; };

Coloque esto en un nuevo archivo de encabezado CMoreFun.hpp e CMoreFun.hpp lugar de CFun.hpp