Pregunta

en C ++, que puede crear fácilmente un puntero de función, tomando la dirección de una función miembro. Sin embargo, es posible cambiar la dirección de esa función local?

es decir. decir que tengo funcA () y funcB () en la misma clase, que se define de manera diferente. Estoy mirando para cambiar la dirección de funcA () a la de funcB (), de tal manera que en tiempo de ejecución llamando funcA () en realidad se traduce en una llamada a funcB (). Sé que esto es feo, pero tengo que hacer esto, gracias!

EDITAR ----------

Antecedentes sobre lo que estoy tratando de hacer:

Estoy esperando para poner en práctica las pruebas unitarias para una base de código existente, algunos de los métodos de la clase base que todos mis módulos están heredando de son no virtual. No estoy autorizado para editar cualquier código de producción. Puedo jugar con el proceso de construcción y el sustituto en una clase base con los métodos pertinentes establecidos a lo virtual, pero pensé que prefiero usar un truco como esto (lo cual pensé que era posible).

Además, estoy interesado en el tema por curiosidad técnica, como a través del proceso de tratar de piratear evitar este problema que estoy aprendiendo un poco acerca de cómo las cosas tales como la generación de código y función de trabajo de consulta bajo la capó, que no he tenido la oportunidad de aprender en la escuela que acaba de terminar segundo año de la universidad. No estoy seguro de que yo pueda llegar a ser enseñado en la escuela tales cosas como que estoy en un programa de ingeniería informática en lugar de CS.

volver sobre el tema El método funcA () y funcB () sí tienen la misma firma, por lo que el problema es que sólo puedo obtener la dirección de una función utilizando el operador &? ¿Sería correcto al decir que no puedo cambiar la dirección de la función, o intercambiar el contenido en esa dirección sin corromper partes de la memoria? la inyección de DLL sería un enfoque bueno para una situación como esta, si las funciones se exportan a un archivo DLL?

¿Fue útil?

Solución

No. Las funciones se compilan en el ejecutable, y su dirección es fija durante todo el tiempo de vida del programa.

Lo más parecido es funciones virtuales. Danos un ejemplo de lo que estamos tratando de lograr, prometo que hay una manera mejor.

Otros consejos

no se puede hacer de la manera que lo describe. La única manera de cambiar el destino de una llamada estáticamente ligado está modificando el código ejecutable real de su programa. lenguaje C ++ no tiene características que podrían lograr eso.

Si desea que las llamadas de función para ser resueltos en tiempo de ejecución que tiene que o bien utilizar explícitamente llamadas indirectas (llamada a través de punteros de función), o las características del lenguaje de uso que se basa en la resolución de la llamada en tiempo de ejecución (como funciones virtuales), o puede utilizar ramificación-llano con el bueno de if o switch. Que es más apropiado en su caso depende de su problema específico.

Técnicamente podría ser posible para las funciones virtuales mediante la modificación de la viable del tipo, pero que sin duda no puede hacerlo sin violar la norma (que causa un comportamiento indefinido) y requeriría el conocimiento de cómo sus específicos manijas del compilador vtables.

Para otras funciones que no es posible debido a que las direcciones de las funciones se escriben directamente en el código del programa, que es generalmente en un área de memoria de sólo lectura.

Lo que queremos es un puntero a una función, puede apuntar a funcA o FuncB asumiendo que tienen la misma firma.

Estoy bastante seguro de que esto es imposible en C ++ puro. C ++ no es un lenguaje dinámico.

No se puede hacer lo que quiere hacer directamente. Sin embargo, se puede lograr un resultado similar con unos criterios ligeramente diferentes, el uso de algo que ya está familiarizado con - punteros de función. Considere lo siguiente:

// This type could be whatever you need, including a member function pointer type.
typedef void (*FunctionPointer)();

struct T {
   FunctionPointer Function;
};

Ahora se puede establecer el miembro Function en cualquier instancia T dado, y lo llaman. Esto es lo más cerca que se puede obtener razonablemente, y supongo que desde ya está al tanto de los punteros de función que ya está al tanto de esta solución.

¿Por qué no editar su pregunta con una descripción más completa del problema que estamos tratando de resolver? Tal como está realmente suena como que está tratando de hacer algo horrible.

Su sencillo!

En

  

en tiempo de ejecución llamando funcA () en realidad se traduce en una llamada a funcB ().

funcA() de escritura similar a la siguiente:

int funcA( int a, int b) {
  return funcB( a, b );
}

: -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top