Question

Je crée une simple application serveur threadée en C ++, j'utilise libconfig ++ pour analyser mes fichiers de configuration.Eh bien, libconfig ne supporte pas le multithreading, donc j'utilise deux classes wrapper afin d'accomplir le "support".Le fait est que l’un d’eux échoue:

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

Échoue horriblement lorsqu'il est appelé depuis mon fichier 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;
    }
}

Et il dit:

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)

Ce qui est bizarre car je passe clairement un argument, et en plus c'est un char *!

Eh bien, comme toujours, toute aide sera appréciée.

Julian.

Était-ce utile?

La solution

Vous essayez de construire votre configuration par défaut, puis de l'assigner plus tard.Mais vous n'avez pas de constructeur par défaut.

La manière correcte de passer un argument au constructeur d'une variable membre est:

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

Vous pouvez toujours intercepter l'exception, en utilisant ce que l'on appelle un bloc d'essais de fonction .Voir http://www.gotw.ca/gotw/066.htm

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

Autres conseils

Tout d'abord, n'allouez pas de mutex dynamiquement, cela ne sert à rien.Deuxièmement, c'est parce que vous avez un membre de données qui ne peut pas être construit par défaut et que vous ne l'avez pas initialisé dans la liste d'initialisation de ctor.De plus, n'attribuez jamais de littéraux de chaîne aux variables char* (il devrait s'agir de app_config(const char*) si vous voulez vraiment utiliser des pointeurs char).

Votre code générique devrait ressembler à ceci:

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top