class A
{
public :
int i;
A* GetPtr()
{
this .i = 1 ;
return (& this );
}
void f()
{
Print ( this .i);
}
};
class B : public A
{
public :
void * GetPtr()
{
this .i = 2 ;
return (& this );
}
};
void g( A* a)
{
a.f();
}
voidOnStart ()
{
B* b = new B;
// b.GetPtr().f(); // 'f' - member function not defined
((A*)b).GetPtr().f(); // 1
((A*)b.GetPtr()).f(); // 2
((A*) ( b.GetPtr() ) ).f(); // Доп. скобки, чтобы подчеркнуть, что именно имелось в виду, не полагаясь на приоритеты.delete b;
}
문자열을 통해서만 다음과 같이 StringConcatenate()를 통해 포인터의 주소를 가져오곤 했습니다.
StringConcatenate 에 대해 몰랐는데 MT5에서 다시 실행되어 더 이상 string s 없이 사용할 수 없다는 것이 유감입니다. 그리고 네 번째에는 StringFormat이 눈에 띄게 빨라집니다.
그리고 일반적으로 어떤 이유로 상위 5개에서 문자열을 통해 포인터를 "단순화"하는 이 작업은 거의 두 배 느립니다. 기본적으로 모든 것이 더 빠르게 작동하지만 때로는 몇 배 정도 더 느립니다.괄호는 표현의 해석에 있어 완전한 모호성을 제공합니다.
지능적인 프로그래머에게 모든 것이 이미 모호하지 않은데 왜 이 추가적 명확성이 있습니까? 그리고 "친절한 컴파일러"의 정신으로 계속한다면 if의 모든 표현식을 중괄호로 묶도록 요구해야 합니다. 그렇지 않으면 어리석은 프로그래머가 뭔가를 혼동할 것입니다.
우리가 더 큰 명확성에 대해 이야기하고 있다면 공백을 넣는 것으로 충분합니다.
솔직히 말해서 그러한 어레이의 의심스러운 이점. 그것으로 무엇을 할 수 있습니까? 배열 구성원에 대해 삭제가 자동으로 호출되지 않는다는 것을 알고 계십니까?
어때요? 객체 소멸자는 항상 가상입니다.
그리고 당신은 시도합니다. void*의 경우에는 기회가 전혀 없습니다.
delete는 누구에게도 자동으로 호출되지 않습니다. 그래서 삭제입니다)
또 다른 것은 이것이 배열 자체의 소멸자에서 어떤 식으로든 간섭하지 않고 목록을 살펴보고 필요한 경우 모든 객체를 제거한다는 것입니다.
여러 가지 이유로 공통 기본 유형을 사용하고 이에 대한 참조를 유지하는 것이 더 유리하지만CArayObject를 덤프로 보내려면 기본 클래스 위에 래퍼(예: https://www.mql5.com/en/forum/170952/page110#comment_9894796) 를 만들고 이를 배열(아마도 당신의 것)이지만 void*는 필요하지 않습니다.
나는 무효*에 반대하는 것이 아니라 필요하지만 다른 자격으로 필요합니다.
그리고 당신은 시도합니다. void*의 경우에는 기회가 전혀 없습니다.
예, 모든 것이 잘 작동합니다. 무엇을 발명하고 있습니까?
로그에서 다음을 얻습니다.
무효 A::~A()
무효 B::~B()
그리고 내가 왜 이것에 빠졌는지...
지능적인 프로그래머에게 모든 것이 이미 모호하지 않은데 왜 이 추가적 명확성이 있습니까? 그리고 "친절한 컴파일러"의 정신으로 계속한다면 if의 모든 표현식을 중괄호로 묶도록 요구해야 합니다. 그렇지 않으면 어리석은 프로그래머가 뭔가를 혼동할 것입니다.
우리가 더 큰 명확성에 대해 이야기하고 있다면 공백을 넣는 것으로 충분합니다.
공간에 대한 가시성은 아무 의미가 없습니다. 스타일리스트 의 세계에 오신 것을 환영합니다.
공간에 대한 가시성은 아무 의미가 없습니다. 스타일리스트 의 세계에 오신 것을 환영합니다.
스타일리스트가 읽을 수 있는 코드에서 코드를 읽기 어렵게 만든다면 그러한 스타일리스트가 그에게 적합하지 않을 수 있습니까?
저에게 스타일러는 모든 규칙을 유연하게 사용자 지정할 수 있을 때만 좋습니다.