es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sobrecarga de funciones con diferente accesibilidad pero también con diferente parámetro.

¿Por qué esto no es posible?

class DBHelper {
public:
    bool open(const char* filepath, const char* query = "");

private:
    bool open(const char* filepath);
}

Si quiero acceder a la función open(filepath) de mi librería desde otra clase, no se compilará, a pesar de que el compilador debería tomar la función pública con el argumento por defecto. No quiero que el usuario de la librería tenga acceso a la función privada. Por supuesto, el usuario podría simplemente llamar a open(filepath, ""). Sin embargo, esto no es cómodo y no tiene sentido, ya que especificé un valor por defecto.

Esta publicación (post) afirma que ambas funciones son visibles. Sin embargo, dado que se deniega el acceso, solo debería haber una opción para el compilador.

Pensé que era un estilo común tener una función de interfaz con parámetros por defecto y funciones privadas que se implementan en función de la entrada.

(La función de interfaz debería crear la estructura por defecto de la base de datos si se proporciona una “consulta de creación”, de lo contrario, simplemente debería intentar abrir una base de datos existente)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que no es posible acceder a la función privada open(filepath) desde otra clase, incluso cuando hay una función pública open(const char* filepath, const char* query = "") con un argumento predeterminado, es porque el compilador siempre elige la función con los parámetros más específicos. En este caso, ambas funciones tienen el mismo tipo de parámetro const char* y no es posible para el compilador saber qué función elegir. Aunque puede parecer conveniente tener una función de interfaz con parámetros predeterminados y funciones privadas que implementen cierta funcionalidad basada en la entrada, es más seguro y claro hacer que esas funciones privadas sean separadas y no depender de argumentos por defecto. De esta manera, el usuario de la biblioteca no puede acceder accidentalmente a la función privada y es más fácil de entender el código.

Comments are closed.