Проблемы с объявлениями и инициализацией - PullRequest
0 голосов
/ 13 июля 2010

Я пытаюсь переписать код, который я написал ранее. Код использует cplex концертный API;

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

    int main(){

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

    return 0;
    }

Этот код (хотя он ничего не делает) работает ... Однако теперь я реализовал свой собственный класс и хотел бы также иметь возможность использовать эти функции, но я не знаю, как их инициализировать. Поэтому на этот раз я написал их в другом классе, называемом решателем.

    //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

Тогда файл 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);
    }

Если я добавлю функцию в этот класс, например функция, которая вызывает x.add (IloNumVar (env)); В первом примере это добавит переменную в x (массив), но когда она у меня в другом классе, я ловлю «tring для реализации пустого дескриптора» ...

Я знаю, что все делаю правильно в основной программе, и я также заставляю ее работать, если у меня нет разных классов Cplex в h.file, но тогда я могу использовать одну и ту же модель только один раз, и я бы хотел называть одну и ту же модель несколько раз.

Есть ли здесь что-то явно не так (кроме отсутствия кода, деструкторов и т. Д.) В h.file или?

Ответы [ 2 ]

5 голосов
/ 13 июля 2010

Этот код:

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

не инициализирует членов вашего класса - оно создает локальные переменные в конструкторе, которые будут уничтожены при выходе из конструктора. Вы хотите что-то вроде:

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

тогда в основном:

int main() {
    IloEnv env;
    solver s( env ); // create solver object
}
0 голосов
/ 13 июля 2010

Возможно

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

ближе к тому, что вы хотите.

...