Вопросы по ООП в MQL5 - страница 74

 
Vladimir Simakov:

Да нет тут указателей) Для класса есть хэндл, да работа с ним похожа на работу с указателем, но на этом все общее и заканчивается.

два дня и две ночи пытливый ум и шаловливые ручки не давали мне покоя

пытался удалить динамически созданный обьект вне области видимости - в функции, методом тыка ну все же попал на решение:

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* &t)
{
   delete t;
}

так удаляет, но догадаться вот так сходу.... да и не нашел ни в справке ни в СБ похожих сигнатур функции для  передачи указателей


такой вопрос еще:

а как вернуть указатель на обьект по ссылке в качестве результат выполнения функции ?

т.е. хочу что то такое сделать:

CTest ret_CTest()
{
   CTest *result = new CTest;
   return(result);
}


вернуть  CTest * без проблем можно, а как написал   ret_CTest() - выдает ошибку

 
Igor Makanu:

два дня и две ночи пытливый ум и шаловливые ручки не давали мне покоя

пытался удалить динамически созданный обьект вне области видимости - в функции, методом тыка ну все же попал на решение:

так удаляет, но догадаться вот так сходу.... да и не нашел ни в справке ни в СБ похожих сигнатур функции для  передачи указателей

Что значит вне области видимости? вы же передали его в функцию, значит он там видим)

з.ы. void deleteCTest(CTest* &t) без этого & тоже должен работать же, или не?

Чтобы действительно удалить вне области где он был создан, да ещё и возможно автоматом, нужен ... тссс... пока никто не слышит... Паттерн Фабрика... читай быстрее и удаляю...

 

Igor Makanu:


а как вернуть указатель на обьект по ссылке в качестве результат выполнения функции ?

вернуть  CTest * без проблем можно, а как написал   ret_CTest() - выдает ошибку
Если ты хочешь кошерное
CTest& Foo();
, то не судьба, пока, а если так:
CTest Foo();

, то у класса должен быть конструктор копирования.

CTest(CTest &other)...
 
Aleksey Mavrin:

з.ы. void deleteCTest(CTest* &t) без этого & тоже должен работать же, или не?

проверь, узнаешь много нового ;)

пишу же который раз, что указатели в MQL штука очень познавательная )))


Vladimir Simakov:
Если ты хочешь кошерное , то не судьба, пока, а если так:

, то у класса должен быть конструктор копирования.

опять подумать нужно

есть подозрение, что с GetPointer() какие то фокусы можно сделать... но не факт.... вот "эти скачки через пространство и время"   - через указатель и неявное разыменование в MQL - это вынос мозга !!! (((

 
Igor Makanu:

проверь, узнаешь много нового ;)

пишу же который раз, что указатели в MQL штука очень познавательная )))

Удаляет, но вот новое значение _test так не присвоить. MQL здесь кстати не причем)))

 
Igor Makanu:

проверь, узнаешь много нового ;)

пишу же который раз, что указатели в MQL штука очень познавательная )))


опять подумать нужно

есть подозрение, что с GetPointer() какие то фокусы можно сделать... но не факт.... вот "эти скачки через пространство и время"   - через указатель и неявное разыменование в MQL - это вынос мозга !!! (((

Да нормально тут все))) Просто от шарпа отключись, тут даже намека на него нет)))

 
Igor Makanu:

проверь, узнаешь много нового ;)

пишу же который раз, что указатели в MQL штука очень познавательная )))

Ну проверил. Удаляется отлично и без &  ;)

А то что принт не выводит, попробуй вот это в МТ4 и в МТ5 и сравни )

class CTest
{
public:
   CTest() { Print(__FUNCTION__); }
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest();
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* t)
{
   delete t;
}
 
Aleksey Mavrin:

Ну проверил. Удаляется отлично и без &  ;)

А то что принт не выводит, попробуй вот это в МТ4 и в МТ5 и сравни )

не полный пример дал, сегодня столкнулся

так не будет работать без &

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
   delete _test;
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* &t)
{
   delete t;
   t = new CTest;
}
//+------------------------------------------------------------------+

Vladimir Simakov:

Да нормально тут все))) Просто от шарпа отключись, тут даже намека на него нет)))


да не ищу я Шарп, с MQL все еще разбираюсь, что не понял - беру спрашиваю 

 
Igor Makanu:

не полный пример дал, сегодня столкнулся

так не будет работать без &

Естественно. Ты же передашь указатель по значению, а следовательно будет создана копия указателя. Через него ты объект пришибешь, а новый объект создашь для указателя, который в функции создан. Это  c++, добро пожаловать))))
 
Igor Makanu:

не полный пример дал, сегодня столкнулся

так не будет работать без &



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

И вроде как  С++ так по стандарту всегда было, хотя давно уже, смутно помню.