Проблема объявления глобальной переменной в C ++ - PullRequest
0 голосов
/ 02 февраля 2011

У меня есть глобальная переменная в классе:

IloModel model;

, который будет разделен между несколькими функциями класса.

В одной из функций я собираюсь инициализировать эту модель следующим образом:

model(env);

Я получаю ошибку: Ошибка 1 ошибка C2064: термин не оценивает функцию, принимающую 1 аргумент

Это работает, если я напишу в функции:

IEnv env;
IloModel model(env);

но не если объект модели объявлен глобально.

Посоветуйте, пожалуйста, как сделать объект модели глобальным, чтобы один и тот же объект можно было использовать для нескольких функций?

Ответы [ 6 ]

6 голосов
/ 02 февраля 2011

когда вы делаете

IloModel model;

Инициализируется с помощью конструктора по умолчанию; итак IloModel()

Что вам нужно сделать, это

model = IloModel(env);

Ошибка, вероятно, связана с тем, что она ищет модель функции с одним параметром, а не находит ее.

1 голос
/ 02 февраля 2011

Не уверен, что я понимаю, что вы имеете в виду под "глобальным", потому что кажется, что вы говорите о члене класса В любом случае, если ваши данные копируемы, вы можете сделать

model = IloModel(env);

это создаст новую модель и скопирует ее поверх текущей.

0 голосов
/ 02 февраля 2011

В последнем примере вы вызываете конструктор, специальную функцию для инициализации объекта.Первый пример пытается вызвать operator() для вашего объекта model, и если класс IloModel не определяет его, он не существует.который создал бы временный объект и немедленно уничтожил бы его снова, хех.

0 голосов
/ 02 февраля 2011

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

class MyClass
{
private:
    IloModel model;

public:
     MyClass(IEnv _env) : model(_env) // constructs model here, passing env
     {
     };

     void someFunction()
     {
         // use model here
     };
}; // eo class MyClass

Теперь я вообще не знаю, что такое IEnv (или модель в этом отношении), поэтому это может не сработать для вас, если логика диктует, что вам нужно каждый раз создавать другую модель с IEnv используйте это.

0 голосов
/ 02 февраля 2011

Вы не можете вызвать конструктор model объекта в более поздний момент времени. Вам нужно сделать это во время определения самого объекта. Если env также глобален, то вы можете сделать IModel model(env).

0 голосов
/ 02 февраля 2011

Почему бы вам не объявить env глобально, а затем напрямую инициализировать модель с env?Другими словами, поместите это глобально:

IEnv env;
IloModel model(env);

В противном случае вы не можете вызвать конструктор для инициализации модели, вам нужен другой метод init для класса IloModel, чтобы указать IEnv после построения.

...