模板参数=void*的编译器错误 - 页 5

 
Igor Makanu:

只通过字符串,我曾经使用StringConcatenate()来获得指针地址,像这样。

我不知道StringConcatenate,很遗憾在MT5中它被重新设计了,没有字符串s就不能使用。而StringFormat在4上要快得多。

一般来说,这种通过字符串 "轮询 "指针的操作在5中要慢两倍,尽管一般来说那里的一切都要快一些,有时要快一个数量级。
 
fxsaber:

方括号使表达完全不含糊。

如果一个聪明的程序员可以毫不含糊地做所有事情,为什么还要增加这种不明确性呢? 如果我们继续本着 "关心编译器 "的精神,那么if中的所有表达式都应该用大括号括起来,以防一个愚蠢的程序员搞混了。

如果我们谈论的是更大的清晰度,那么把空间放进去就足够了。

a<<1 | b<<2 | c<<3
 
pavlick_:

坦率地说,这样一个阵列的作用是值得怀疑的。你能用它做什么?你知道你不会自动对数组成员调用删除,对吗?

为什么? 对象的解构器总是虚拟的
 
Alexey Navoykov:
对象的析构器总是虚拟的,为什么?

试试吧。在无效的情况下*,根本就没有机会。

 

删除对任何人来说都不是自动调用的)。

这是另一回事,它并不妨碍数组析构器在必要时浏览列表并删除所有对象

尽管出于许多原因,使用一个共同的基类型并存储对它的引用更为有利
 

如果你想废除CArayObject,你必须在基类上做一个覆盖(比如这个https://www.mql5.com/ru/forum/170952/page110#comment_9894796),并把它们放在一个数组中(可能是你的),但这样你就不再需要void*了。

我不反对无效*,它是需要的,但以不同的身份。

 
pavlick_:

试试吧。在无效的情况下*,根本就没有机会。

一切工作都很正常,你为什么要编造这个?

class B
{
 public: 
  ~B() { Print(__FUNCSIG__); }
};

class A
{
 public: 
  B b;
  ~A() { Print(__FUNCSIG__); }
};

void OnStart()
  {
   A* a= new A;
   
   void* p= a;
   delete p;
  }

我们在日志中得到了它。

void A::~A()
void B::~B()

我为什么要上当呢......。

 
Alexey Navoykov:

如果一个聪明的程序员可以毫不含糊地做所有事情,为什么还要增加这种不明确性呢? 如果我们继续本着 "关心编译器 "的精神,那么if中的所有表达式都应该用大括号括起来,以防一个愚蠢的程序员搞混了。

如果我们谈论的是更多的清晰度,那么把空间放进去就足够了。

如果你不想用空格来表达清楚,欢迎你来到风格化 的世界。

 
关于额外的托架
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();
}

void OnStart()
{    
  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;
}
 
fxsaber:

空间上的能见度不算什么--欢迎来到造型工具的 世界。

如果一个样式器使难以阅读的代码变得不可读,那么就不要再去理会这个样式器了。

对我来说,只有当一个造型器的所有规则都可以灵活地定制时,它才是好的。