Работа с Clist - страница 2

 
postnikovmaksim:

Спасибо, я понял свою ошибку. У меня получилось что я указатель пытаюсь присвоить модели, естественно ничего не получилось. Но если написать:

то я получу указатель, и сохраню в корректную переменную. Во всяком случае вроде бы получилось - модель после прочтения корректна.

А можно пожалуйста еще раз ссылку на "время жизни" объекта, а то ссылка вроде не туда куда надо ведет.


у вас ссылка на объект создается внутри ф-ии, создайте ее на глобальном уровне

CModel *firstNode;

а потмо надо удалить при деинициализации delete firstNode;

 
postnikovmaksim:

Меня как раз вариант создания новой модели в функции устраивает. Я анализирую историю и если нахожу подходящую модель, то ее создаю. А так как каждый раз при поиске модели я пробегаю по историческим данным, то повторы хочу отсекать анализируя ранее сохраненные модели. Лишнее модели буду удалять, например в случае повторения.


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

и там в остальном по коду в цикле for дичь какая-то :)

 
postnikovmaksim:

Спасибо, я понял свою ошибку. У меня получилось что я указатель пытаюсь присвоить модели, естественно ничего не получилось. Но если написать:

то я получу указатель, и сохраню в корректную переменную. Во всяком случае вроде бы получилось - модель после прочтения корректна.

А можно пожалуйста еще раз ссылку на "время жизни" объекта, а то ссылка вроде не туда куда надо ведет.

Именно так.

Теперь у тебя есть модель, и есть объявленный указатель на нее. Ты берешь указатель на имеющуюся модель, присваиваешь вершине списка, потом берешь с вершины указатель, присваиваешь созданному указателю - понятно, что он будет указывать на ту самую модель, которая изначально была у тебя передана в функцию. Все в порядке.

Тебе, действительно, хорошо бы разобраться со временами жизни объектов.  Если ты создаешь объект просто объявлением - то он создается "на стеке", и существует только в пределах того блока, где объявлен.

Обычно объекты для списков создаются по new. Тогда - у тебя будут только указатели.  Но, только в этом случае - необходимо позаботиться об удалении этих объектов (через delete),  когда они будут не нужны.

 
George Merts:

Метод Add() ждет указателя на объект.

А ты передаешь туда ссылку на объект (интересно, как это удалось сделать ?).

GetPointer(), думаю, должен помочь.

Но, обрати внимание на время жизни твоего объекта - возможен случай, когда объект будет удален, а список будет существовать.


А никак, этот код не компилируется )))

sellList.Add(&model);//не компилируется
postnikovmaksim:

Спасибо, я понял свою ошибку. У меня получилось что я указатель пытаюсь присвоить модели, естественно ничего не получилось. Но если написать:

то я получу указатель, и сохраню в корректную переменную. Во всяком случае вроде бы получилось - модель после прочтения корректна.

А можно пожалуйста еще раз ссылку на "время жизни" объекта, а то ссылка вроде не туда куда надо ведет.


Тогда уж вот так

CModel *firstNode=(CModel*)sellList.GetFirstNode();

**

 
Alexey Volchanskiy:

А никак, этот код не компилируется )))


На удивление компилировался.

Написал и протестировал:

void AddNewModel(CModel &model)
  {
   if(sellList.Total()!=0)
     {
      for(CModel *node=sellList.GetFirstNode();node!=NULL;node=sellList.GetNextNode())
        {
         if(model.valuePointB==node.valuePointB && 
            model.timePointB==node.timePointB)
           {
            delete &model;
            return;
           }
        }
     }
   sellList.Add(&model);
  }

Спасибо за помощь, все заработало как и хотел.

 
George Merts:

Метод Add() ждет указателя на объект.

А ты передаешь туда ссылку на объект (интересно, как это удалось сделать ?).

Где вы там усмотрели ссылку, если стоит оператор взятия указателя
 
George Merts:

Вопрос - у тебя конструктор копирования есть ?  Без конструктора копирования - понятное дело, что объект firstNode - не будет равен объекту model.

Подозреваю также, что ты хочешь иметь только один объект model, а не два - model и firstNode.

Maxim Dmitrievsky:

у вас ссылка на объект создается внутри ф-ии, создайте ее на глобальном уровне

а потмо надо удалить при деинициализации delete firstNode;

Блин, люди, вы о чем вообще? На лицо полное не понимание как работают указатели, а также как выделяется память в MQL. И эти советы дают люди с таким рейтингом!