Pregunta

Estoy haciendo una aplicación de servidor enhebrada simple en C ++, es que uso libconfig ++ para analizar mis archivos de configuración. Bueno, Libconfig no admite múltiples lecturas, por lo tanto, estoy usando dos clases de envoltura para lograr "soporte". El punto es que uno de ellos falla:

class app_config {
    friend class app_config_lock;
public:
    app_config(char *file) :
        cfg(new libconfig::Config()),
        mutex(new boost::mutex())
    {
        cfg->readFile(file);
    }

private:
    boost::shared_ptr<libconfig::Config> cfg;
    boost::shared_ptr<boost::mutex> mutex;
};

Falla horriblemente cuando se llama desde mi archivo principal.cpp:

app_main::app_main(int c, char **v) : argc(c), argv(v) {
    // here need code to parse arguments and pass configuration file!.
    try {
        config = app_config("mscs.cfg");
    } catch (libconfig::ParseException &e) {
        cout << "Parse error at line " << e.getLine() << ": " << e.getError() << endl;
        throw;
    } catch (libconfig::FileIOException &e) {
        cout << "Configuration file not found." << endl;
        throw;
    }
}

Y dice:

main.cpp: In constructor ‘app_main::app_main(int, char**)’:
main.cpp:38:54: error: no matching function for call to ‘app_config::app_config()’
main.cpp:38:54: note: candidates are:
../include/app_config.h:15:5: note: app_config::app_config(char*)
../include/app_config.h:15:5: note:   candidate expects 1 argument, 0 provided
../include/app_config.h:12:7: note: app_config::app_config(const app_config&)
../include/app_config.h:12:7: note:   candidate expects 1 argument, 0 provided
main.cpp:41:39: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] (THIS CAN BE IGNORED, I WAS USING STD::STRING, YET CHANGED IT FOR TESTING PURPOSES)

Lo cual es extraño porque claramente estoy pasando una discusión, y además es un char *!.

Bueno, como siempre, cualquier ayuda será apreciada.

Julian.

¿Fue útil?

Solución

Está tratando de construir su configuración predeterminada y luego asignarla más tarde. Pero no tienes un constructor predeterminado.

La forma correcta de pasar un argumento al constructor de una variable miembro es:

app_main::app_main(int c, char **v) : argc(c), argv(v), config("mscs.cfg")

Todavía puede atrapar la excepción, utilizando lo que se conoce como un función try-block. Ver http://www.gotw.ca/gotw/066.htm

Código final:

app_main::app_main(int c, char **v)
try : argc(c), argv(v), config("mscs.cfg")
{
    // more constructor logic here
} catch (libconfig::ParseException &e) {
    cout << "Parse error at line " << e.getLine() << ": " << e.getError() << endl;
    throw;
} catch (libconfig::FileIOException &e) {
    cout << "Configuration file not found." << endl;
    throw;
}

Otros consejos

En primer lugar, no asignes a Mutexes dinámicamente, no tiene ningún propósito. En segundo lugar, es porque tiene un miembro de datos que no se puede construir por defecto, y no lo inicializó en la lista de inicio de CTOR. Además, nunca asigne literales de cadena a char* variables (debería ser app_config(const char*) Si realmente quieres incursionar con punteros de char).

Su app_main::app_main Debería verse así:

app_main::app_main(int c, char **v) try
    : argc(c), argv(v), config("mscs.cfg") {
} catch (libconfig::ParseException &e) {
    cout << "Parse error at line " << e.getLine() << ": " << e.getError() << endl;
    throw;
} catch (libconfig::FileIOException &e) {
    cout << "Configuration file not found." << endl;
    throw;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top