Tienes cuatro opciones que se me ocurre, tres de los cuales ya han sido nombrados por los demás:
ir a la ruta de la fábrica, según lo sugerido por varios otros aquí. Una desventaja de esto es que no puede tener nombres consistentes por sobrecarga (de lo contrario tendría el mismo problema), por lo que es superficialmente menos limpio. Otra desventaja más grande es que excluye la posibilidad de asignar directamente en la pila. Todo se asignará en el montón si toma este enfoque.
Envoltorios de objetos personalizados. Este es un buen enfoque, y el que recomendaría si está empezando desde cero. Si tiene una gran cantidad de código utilizando, por ejemplo, insignias como cadenas, entonces reescribir el código puede hacer que esta sea una opción inviable.
Agregue una enumeración al método, especificando cómo tratar la cadena. Esto funciona, pero requiere que reescriba todas las llamadas existentes para incluir la nueva enumeración (aunque puede proporcionar un valor predeterminado si lo desea para evitar algo de esto).
Agregue un parámetro ficticio que no se use para distinguir entre las dos sobrecargas. p.ej. Tack bool
en el método. Este enfoque lo toma la biblioteca estándar en algunos lugares, p. std::nothrow
es un parámetro ficticio para operator new
. Las desventajas de este enfoque son que es feo y no se escala.
Si ya tiene una gran base de código existente, lo recomiendo, ya sea añadiendo la enumeración (posiblemente con un valor por defecto) o añadiendo el parámetro ficticio. Ninguno de los dos es bello, pero ambos son bastante simples de adaptar.
Si está comenzando desde cero, o solo tiene una pequeña cantidad de código, recomendaría los envoltorios de objetos personalizados.
Los métodos de fábrica serían una opción si tiene un código que usa en gran medida las cadenas badge
/logonName
sin procesar, pero no usa la clase Person
.
Eso es una sola (una línea) declaración, pero se echa de menos la ventaja de los constructores: los constructores * requieren * que proporcione algunos parámetros, mientras que los inicializadores son solo variables públicas. – drizin