Estoy tratando de usar las macros __FILE__
y __LINE__
en un constructor como parámetros predeterminados, pero parece que no puedo obtener las macros para usar los archivos correctos. Siguen expandiéndose desde mi archivo de encabezado.¿Cómo uso __FILE__ y __LINE__ como parámetros predeterminados en un constructor en C++?
Más detalladamente: me gustaría tener el archivo y el número de línea desde donde se crea una instancia de un objeto como miembros de mi clase. Pero no quiero tener que ir y poner los parámetros a mano cada vez que quiero usar los objetos. Sé que hay una manera de hacer esto, pero no puedo por la vida de mí resolverlo. Lo que estoy haciendo actualmente es el siguiente:
En mi archivo de cabecera:
mnNumber(float x, const char* filename = __FILE__, int linenumber = __LINE__):
value(x), mFileName(filename), mFunctionName(nullptr), mLineNumber( linenumber), mID(0)
Pero, ARCHIVO y LÍNEA conseguir ampliada como si fueran de mi archivo de cabecera, no el real ubicación que uso el mnNumber.
Para responder a la pregunta de por qué me gustaría hacer esto, quiero que el código lea su propia página de códigos. Los valores particulares que utilizo se registran en un administrador y el usuario final puede editar su valor. Cuando el usuario final termina de editar el valor, el valor se vuelve a escribir en la página de códigos. Entonces, necesito saber de dónde vino el valor. También le permito al usuario final decir que nunca más necesitarán editar este valor, y cuando hacen clic en ese botón, el valor se convierte de un mnNumber nuevamente en un flotante, y el tipo en la página de códigos se reescribe como un flotador . O, será ... con suerte.
¿Algún consejo para mí?
Respuesta corta: No puede usarlos de la manera que desee. Se expanden en la ubicación donde está escrito el código fuente del constructor, así es como funciona el preprocesador. Es un motor de procesamiento de texto que no sabe nada sobre "parámetros de función" y los "me gusta". El compilador, lo que en realidad trata con funciones, argumentos, etc., viene después de que el preprocesador finaliza. – Xeo
Necesita usar macros en lugar del constructor. Simplemente no funcionará de otra manera. Esto significa que falla completamente en el código genérico, por ejemplo. –
¿Y mi gerente es un singleton? ¡Solución inteligente! – steffen