ООП New* Знатокам

 

Все статьи, это конечно, прекрасно... Но, возможно я не нашел, или не понял как правильно использовать такие операторы как 'new' и '*'(звездочка, в данном контексте). Не пойму, как их использовать, а необходимость назрела. Такой пример:

Есть определенный класс, отвечающий за подачу сигнала по указанному инструменту. Надо его размножить на какое-то произвольное количество инструментов с различными настройками входных переменных. А если конкретно, примерно так:

есть класс CSignal с параметрами. Определен как Signal

int SigValue; string Sybm[n];

...вот тут (в цикле) надо создать определенное (n) количество копий класса CSignal для каждого инструмента в отдельности, со своими настройками. Как это правильно сделать?

for(...) {SigValue=Signal(Sybm[n])} //lдальше опрос, уже не важно

PS. Будьте добры, расскажите поподробней про операторы  'new' и особенно '*'. Как их правильно использовать, ума не приложу..

 
Мне кажется, я уже давал Вам ссылку на статью Когда нужно использовать указатели в MQL5.
 

Пардон, вероятно это был не я, или это было давно.

Спасибо. 

 

Если у Вас создаются объекты одного и того же класса, то самым лучшим вариантом будет массив объектов этого класса. Не нужно заморачиваться с new и delete

 
stringo:

Если у Вас создаются объекты одного и того же класса, то самым лучшим вариантом будет массив объектов этого класса. Не нужно заморачиваться с new и delete

Честно говоря, не получается создать даже не просто массив, а просто копию класса. я не силен в ооп, вероятно в этом проблема. будет здорово, если вы добавите в список статей к публикации что-нибудь типа "оператор 'new' и '*'"

Думаю, это будет не только мне полезно. Уверен, mql5 рулит!!!!

 
pronych:

Честно говоря, не получается создать даже не просто массив, а просто копию класса. я не силен в ооп, вероятно в этом проблема. будет здорово, если вы добавите в список статей к публикации что-нибудь типа "оператор 'new' и '*'"

Думаю, это будет не только мне полезно. Уверен, mql5 рулит!!!!

Для понимания ООП, нужно в первую очередь понимать, что есть КЛАСС это просто описание ... хм, ну типа чертеж некой фигни. А сама фигня называется либо "экземпляр класса" либо "объект". Лучше для понимания использовать именно слова "экземпляр класса", так как объект как-то слишком уж абстрактно. Да и обычно для разных нужд создают такие КЛАССЫ с именем "объект".


Ну дак вот представьте себе что у вас есть чертеж ( объявление класса ) автомобиля, и когда вы хотите изготовить  (создать неких объект - "экземпляр" этого вашего класса ) реальный автомобиль, то вы говорите NEW. То есть "хочу новый автомобиль по данному чертежу". А чтобы потом можно были ОПЕРИРОВАТЬ с созданным вами автомобилем вы должны где-то хранить "ссылку" ( ярлык  если хотите) на этот ваш новый созданный автомобиль. Вот это и есть указатель, это и есть  "*".


То есть ВЫ создаете чертеж

class MyAvto_Model_A12 { int a, int b;  };

А когда создаете уже сам авто по тем чертежам пишите так

MyAvto_Model_A12 * pAvto;

Это Вы создали ярлык для хранения "экземпляра класса".

А теперь можно уже создать авто.

pAvto= new MyAvto_Model_A12

через NEW.

А пользоваться этим созданным авто нужно так -

pAvto->a;
 

Вот можно сказать, всё понятно!)) И про экземпляры, и про ту самую статью Рашида. Одного не могу добиться. Создать экземпляры класса. Вот хоть убей, не создаются и всё... Даже на стадии компиляции. Компилятор ругается или на звездочку или на new, и вообще, не пойму как создать массив ссылок на определенный класс (видимо, в моем случае, ссылки- это правильней)

Задача такая:

Есть тело программы

OnInit()

 ...тут мы получаем список инструменов. назовем его Syms[n]

тут же надо определиться с тем, присутствует инструмент или нет, это готово.

далее  надо (мы ведь мультивалютные теперь) размножить один класс сигналов на все доступные Syms[n] инструменты! тут у меня трабл

OnTick (или по таймеру)

опрос трабла...

Не могу создать экземпляр класса!  Не понимаю, как это сделать.Вот прикрепленного.

 

Файлы:
 

 

class CSignal
{
  public:
// ...
  void Print();
};

CSignal eurusd,gbpusd;
CSignal symbols[10];

 CSignal - это класс (или "чертеж"/описание, как сказал Academic),

eurusd и gbpusd - это переменные типа CSignal (т.е. объекты/экземпляры класса CSignal). Соответственно можно обращаться eurusd.Print(), gbpusd.Print() 

symbols[10] - массив объектов. Значит можно обращаться symbols[3].Print().

pronych, на операторы new,* следует обратить внимание, когда начнете использовать виртуальные функции.

 

yu-sha. 

О как. теперь понятней. Спасибо за уточнение. буду пробовать создать массив.

Я имею ввиду че-нить типа symbols[] ну это уже завтра.  спасибо, теперь вроде понятней стало. всего- то делов )) не прощаюсь)))

Причина обращения: