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中它被重新设计了,没有字符串s就不能使用。而StringFormat在4上要快得多。
一般来说,这种通过字符串 "轮询 "指针的操作在5中要慢两倍,尽管一般来说那里的一切都要快一些,有时要快一个数量级。方括号使表达完全不含糊。
如果一个聪明的程序员可以毫不含糊地做所有事情,为什么还要增加这种不明确性呢? 如果我们继续本着 "关心编译器 "的精神,那么if中的所有表达式都应该用大括号括起来,以防一个愚蠢的程序员搞混了。
如果我们谈论的是更大的清晰度,那么把空间放进去就足够了。
坦率地说,这样一个阵列的作用是值得怀疑的。你能用它做什么?你知道你不会自动对数组成员调用删除,对吗?
对象的析构器总是虚拟的,为什么?
试试吧。在无效的情况下*,根本就没有机会。
删除对任何人来说都不是自动调用的)。
这是另一回事,它并不妨碍数组析构器在必要时浏览列表并删除所有对象
尽管出于许多原因,使用一个共同的基类型并存储对它的引用更为有利如果你想废除CArayObject,你必须在基类上做一个覆盖(比如这个https://www.mql5.com/ru/forum/170952/page110#comment_9894796),并把它们放在一个数组中(可能是你的),但这样你就不再需要void*了。
我不反对无效*,它是需要的,但以不同的身份。
试试吧。在无效的情况下*,根本就没有机会。
一切工作都很正常,你为什么要编造这个?
我们在日志中得到了它。
void A::~A()
void B::~B()
我为什么要上当呢......。
如果一个聪明的程序员可以毫不含糊地做所有事情,为什么还要增加这种不明确性呢? 如果我们继续本着 "关心编译器 "的精神,那么if中的所有表达式都应该用大括号括起来,以防一个愚蠢的程序员搞混了。
如果我们谈论的是更多的清晰度,那么把空间放进去就足够了。
如果你不想用空格来表达清楚,欢迎你来到风格化 的世界。
空间上的能见度不算什么--欢迎来到造型工具的 世界。
如果一个样式器使难以阅读的代码变得不可读,那么就不要再去理会这个样式器了。
对我来说,只有当一个造型器的所有规则都可以灵活地定制时,它才是好的。