2010-07-13 12 views
0

J'essaie de réécrire un code que j'ai écrit précédemment. Le code utilise l'API de concert cplex;Problèmes avec les déclarations et les initialisations

#include <ilcplex/ilocplex.h> 
    using namespace std; 
    ILOSTLBEGIN 

    int main(){ 

    IloEnv env; 
    IloModel model(env); 
    IloVarArray x(env); 
    IloCplex cplex(model); 

    return 0; 
    } 

Ce code (bien qu'il ne fait rien) fonctionne ... Mais maintenant j'ai mis ma propre classe et je voudrais pouvoir utiliser ces fonctions aussi bien, mais je ne sais pas comment les initier. Donc, cette fois je les ai écrits dans une classe differnet appelée solveur.

//solver.h 
    #ifndef solver_h 
    #define solver_h 
    #include <ilcplex/ilocplex.h> 
    class solver{ 
    public: 
     IloModel model; 
    IloNumVarArray x; 
    IloRangeArray con; 
    IloCplex cplex; 
    solver(); 
    solver~(); 

    }; 

#endif 

Ensuite, le fichier cpp

//solver.cpp 
    #include <ilcplex/ilocplex.h> 
    #include <vector> 
    using namespace std; 
    #include "solver.h" 
    ILOSTLBEGIN 
    solver::solver(){ 
    IloEnv env; 
    IloModel model(env); 
    IloVarArray x(env); 
    IloCplex cplex(model); 
    } 

Si j'ajouter une fonction à cette classe par exemple une fonction qui appelle x.add (IloNumVar (env)); Dans le premier exemple ceci ajouterait une variable au x (array), mais quand je l'ai dans une classe différente j'attrape "tring pour implémenter la poignée vide" ...

Je sais que je fais tout droit dans le programme principal, et je l'obtiens aussi pour fonctionner si je n'ai pas les différentes classes de Cplex dans le h.file mais alors je peux seulement utiliser le même modèle une fois et je voudrais appeler le même modèle plusieurs fois.

Y a-t-il quelque chose qui cloche ici (en plus du manque de code, de destructeurs, etc ...) dans le h.file ou?

Répondre

5

Ce code:

solver::solver(){ 
    IloEnv env; 
    IloModel model(env); 
    IloVarArray x(env); 
    IloCplex cplex(model); 
} 

n'est pas membres de votre initialise classe - il crée des variables locales dans le constructeur, qui détruit lors de la sortie du constructeur. Vous voulez quelque chose comme:

solver :: solver(IloEnv & env) 
     : model(env), x(env), cplex(model) { 
} 

puis dans le principal:

int main() { 
    IloEnv env; 
    solver s(env); // create solver object 
} 
+0

Ah merci! J'ai pensé que ma question était trop longue et désordonnée pour que quelqu'un la lise, mais clairement pas! –

0

Peut-être

solver::solver() : model (env), x (env), cplex (model) 
{ 
} 

est plus proche de ce que vous voulez.

+0

Bien que cela échoue, car 'env' n'est pas défini. – sbi

+0

Tout à fait correct. La nouvelle édition de M. Butterworth l'a. –