Domanda

Sto realizzando una semplice applicazione server thread in C ++, la cosa è che utilizzo libconfig ++ per analizzare i miei file di configurazione. Bene, libconfig non supporta il multithreading, quindi sto usando due classi wrapper per ottenere "supporto". Il punto è, uno di questi fallisce:

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;
};

Fallisce orribilmente quando viene chiamato dal mio file main.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;
    }
}

E 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)

Che è strano perché sto chiaramente superando una discussione e inoltre è un char *!.

Bene, come sempre, qualsiasi aiuto sarà apprezzato.

Giuliano.

È stato utile?

Soluzione

Stai cercando di costruire la configurazione predefinita, quindi assegnarla in seguito. Ma non hai un costruttore predefinito.

Il modo corretto per passare un argomento al costruttore di una variabile membro è:

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

Puoi ancora intrappolare l'eccezione, usando ciò che è noto come a Funzione Try-Block. Vedere http://www.gotw.ca/gotw/066.htm

Codice finale:

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;
}

Altri suggerimenti

Prima di tutto, non allocare i mutex in modo dinamico, non serve a nulla. In secondo luogo, è perché hai un membro dei dati che non può essere costruito predefinito e non l'hai inizializzato nell'elenco CTOR INIT. Inoltre, non assegnare mai i letterali di stringa a char* variabili (dovrebbe essere app_config(const char*) Se vuoi davvero dilettarti con i puntatori di char).

Tuo app_main::app_main dovrebbe apparire così invece:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top