Мне одному кажется что вот такой код не должен компилироваться (должна быть private member access error)?
class cA;
class cB;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+class cA
{
//====================private:
//====================//===============//===============
cB *B;
//===============//===============void testfunc(void){::Print(__FUNCSIG__);}
//====================public:
//====================//===============//===============void test(void)
{
::Print(__FUNCSIG__);
if(::CheckPointer(::GetPointer(this.B))==POINTER_INVALID)return;
this.B.testfunc();// Здесь идет вызов private метода объекта B, что вроде как не должно быть возможным
}
//===============//===============void SetB(cB *const b){this.B=b;}
//===============//===============
};
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+class cB : public cA
{
};
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+intOnInit()
{
//---
cA A;
cB B;
A.SetB(&B);
A.test();
//---return(INIT_SUCCEEDED);
}
Мне одному кажется что вот такой код не должен компилироваться (должна быть private member access error)?
В СД говорят что все ок, и так можно...
Согласно правилам MQL экземпляр класса может свободно обращаться к закрытым полям и методам другого экземпляра, если он принадлежит тому же классу, что и первый. Так-как сB наследуется от cA, то cB и есть cA, а следовательно cA может обращаться к любым закрытым методам и полям экземпляра cB, не зависимо от того, где он объявлен.
Согласно правилам MQL экземпляр класса может свободно обращаться к закрытым полям и методам другого экземпляра, если он принадлежит тому же классу, что и первый. Так-как сB наследуется от cA, то cB и есть cA, а следовательно cA может обращаться к любым закрытым методам и полям экземпляра cB, не зависимо от того, где он объявлен.
Спасибо. В документации об этом не встречал. Можете ткнуть носом?
Andrey Barinov: Спасибо. В документации об этом не встречал. Можете ткнуть носом?
В документации этого нет, т.к. является такой своеобразной недокументированной "фичей" языка. Фича очень странная и противоречивая, но тем не менее так сложилось.
Andrey Barinov: Спасибо. В документации об этом не встречал. Можете ткнуть носом?
Это и в C++ так (а MQL строится по образу и подобию C++). Как говорят, приватность C++ - на уровне класса, а не объекта. Иначе было бы невозможно сделать, например, copy-конструктор, без специальных методов getter-ов для всех приватных полей.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Добрый день.
Мне одному кажется что вот такой код не должен компилироваться (должна быть private member access error)?
В СД говорят что все ок, и так можно...
Добрый день.
Мне одному кажется что вот такой код не должен компилироваться (должна быть private member access error)?
В СД говорят что все ок, и так можно...
Согласно правилам MQL экземпляр класса может свободно обращаться к закрытым полям и методам другого экземпляра, если он принадлежит тому же классу, что и первый. Так-как сB наследуется от cA, то cB и есть cA, а следовательно cA может обращаться к любым закрытым методам и полям экземпляра cB, не зависимо от того, где он объявлен.
Согласно правилам MQL экземпляр класса может свободно обращаться к закрытым полям и методам другого экземпляра, если он принадлежит тому же классу, что и первый. Так-как сB наследуется от cA, то cB и есть cA, а следовательно cA может обращаться к любым закрытым методам и полям экземпляра cB, не зависимо от того, где он объявлен.
Спасибо. В документации об этом не встречал. Можете ткнуть носом?
Спасибо. В документации об этом не встречал. Можете ткнуть носом?
Это и в C++ так (а MQL строится по образу и подобию C++). Как говорят, приватность C++ - на уровне класса, а не объекта. Иначе было бы невозможно сделать, например, copy-конструктор, без специальных методов getter-ов для всех приватных полей.
Это и в C++ так
Спасибо. В документации об этом не встречал. Можете ткнуть носом?
Соответственно доступ к testfunc() возможен только (и только) из методов cA:: -> в данном случае из сA::test()
А вы пробовали этот пример в С++ компилировать - или это общие теоретические рассуждения?
А вы по ссылке пробовали переходить? Там можно не только откомпилировать, но и успешно выполнить пример.
А вы по ссылке пробовали переходить? Там можно не только откомпилировать, но и успешно выполнить пример.
Почему тогда такой код не работает?
Я не вижу разницы между (1) и (2).
А вы по ссылке пробовали переходить? Там можно не только откомпилировать, но и успешно выполнить пример.