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