エラー、バグ、質問 - ページ 1736

 
coderex:

興味のある方は、サーベデスクの回答をご覧ください。

На данный момент оператор *(dereference/indirection) можно использовать только для указателей на объекты классов и это rvalue

とても興味があります!サービスデスクの回答は、例を挙げて説明してください。

& == GetPointer().* - 何も変わっていません。

 
fxsaber:

とても興味があります!サービスデスクの回答は、例を挙げて説明してください。

& == GetPointer().* - 何も変わっていません。

どのような例が必要ですか?
 
coderex:

という質問には、サービスデスクがお答えします。

На данный момент оператор *(dereference/indirection) можно использовать только для указателей на объекты классов и это rvalue
先日、任意のデータ型への ポインターの導入について提案を送りました。そして、この馬鹿げた規制は迷惑だ。
 
Alexey Navoykov:
ところで、先日、任意のデータ型に ポインターを導入することについての提案を送った。そして、この馬鹿げた規制がすでに迷惑なのです。
演算子のオーバーロードを導入するのは良いことだと思う。それなしではSTLとの同一性を実現できないからだ。
 
coderex:
演算子のオーバーロードを導入するのは良いことだと思います。このオーバーロードがなければ、STL で ID を実現することができないからです。
はい、そうですね。すべてが未完成の状態なんです。また、オーバーロードという点ではゴーストオペレーターの方が気になりますね、これがないと辛いですから。
 
coderex:
どのような例が必要ですか?
と&に求めること。シンプルだけど、イラストのようなもの。だから、便利さがわかるんです。
 
fxsaber:
と&に求めること。シンプルだけど、イラストのようなもの。利便性を見るために。

欲しいもの......すでに上に書きましたね。

GetPointer(...)を使って、'&'演算子を使った例を自分で作ることもできますが、これは本質的に短い形式です。

演算子'*'を使った例......理解の助けになるかどうか分かりませんが。

class Iterator
  {
   int m_value;
public:
   Iterator(const int val) : m_value(val) { }
   int operator*() { return m_value; }
  };

int main(int argc, char **argv) {
   Iterator *_it = new Iterator(5);
  
   int _val = **_it;
//---
   return 0;
}


はC++で動作しますが、MQLではm_valueの取得にゲタを履かせる必要があります。

 

ChartRedraw(MainChartID)はOBJ_CHARTの 再描画には適さないことをヘルプに追記しました。ChartRedraw(ObjChartID)が必要です。

したがって、ヘルプの例は誤りです。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

N <= 5 (バー下の領域の大きさ = 2^N) に限定しないようお願いします。

これは、ティック履歴を より詳細に見ることができるようにするために必要な(そして便利になった)ものです。

 
明確にしてください。スクリプト
class A
{
public:
  const int a;
  
  A( int c = 0 ) : a(c) {}
  
  virtual int f()
  {
    Print(__FUNCTION__);
    
    return(this.a);
  }
};

class B : public A
{
public:
  const int b;
  
  B( int c = 0 ) : A(c), b(this.f()){}

  virtual int f()
  {
    Print(__FUNCTION__);
    
    return(this.a);
  }
};


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

結果

2016.10.18 09:35:01.981 Test14 (GBPUSD,M1)      B::f
2016.10.18 09:35:01.981 Test14 (GBPUSD,M1)      B::f

A::fではなく、B::Fが出力される理由は何でしょうか?スクリプトは、コンストラクタ本体が実行される前にfが呼び出されるように書かれています(太字)。しかし、この時点ではすでにAベースクラスのコンストラクタが 呼び出されています。そのため、this.f()はBのコンストラクタが呼ばれる前に、正確にベースクラスを参照しているようです。推論・予測の誤りはどこにあるのか、説明してほしい。