2010-07-13 3 views
0

이전에 작성한 코드를 다시 작성하려고합니다. 코드는 cplex concert 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라는 differnet 클래스에 작성했습니다. 이어서

//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 (배열)에 변수가 추가되지만 다른 클래스에 있으면 "비어있는 핸들을 구현하는 것이 좋습니다"라는 메시지가 표시됩니다 ...

나는 모든 것을 올바르게하고 있습니다. 주 프로그램에서, 그리고 나는 h.file에서 다른 Cplex 클래스를 사용하지 않아도 작동하지만, 같은 모델을 한 번만 사용할 수 있고 동일한 모델을 여러 번 호출하고 싶을 때도 사용할 수 있습니다.

h.file에 코드 나 소멸자 등이 없으면 분명히 잘못된 것이 있습니까?

답변

5

이 코드 :

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

감사합니다. 누군가 내 질문에 너무 길고 지저분한 생각으로 읽었지만 명확히 이해하지 못했습니다. –

0

는 아마도

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

당신이 원하는에 가깝다.

+0

'env'가 정의되어 있지 않기 때문에 실패합니다. – sbi

+0

아주 정확합니다. Butterworth의 새로운 편집장이 있습니다. –