MQL5におけるOOPに関する質問 - ページ 81

 

キャスティングに関するもう一つの質問

このコードがあります。

struct SHash
   {
      ulong hash[2];
      SHash()                                {  }
      SHash(const double)                    { ArrayInitialize(hash, 0xAAAAAAAAAAAAAAAA);                }
      SHash(const SHash &val)                { ArrayCopy(hash, val.hash);                                }
      bool operator==(const SHash &val)const { return(hash[0] == val.hash[0] && hash[1] == val.hash[1]); }
   };
//+------------------------------------------------------------------+
class BASE
{
private:
   const SHash _hash;
protected:
   BASE(SHash &hash): _hash(hash)             {  }
};

class A:BASE
{
public:
   A(SHash &hash):BASE(hash)                 {  }
};


class B:BASE
{
public:
   B():BASE((SHash)0.0)                      {  }
};

//+------------------------------------------------------------------+
void OnStart()
{
   SHash h(0.0);
   A a(h);
}
//+------------------------------------------------------------------+

で、クラス B をパラメータなしのコンストラクタで初期化したいのですが、SHash 構造体をコンストラクタ SHash(const double) にキャストできないのです。

つまり、キャスティング(SHash)ダブルが必要です。

この例では、コンパイラーエラーが発生します: '(SHash)' - invalid cast operation


このように書くと

class B:BASE
{
public:
   B():BASE(0.0)                      {  }
};
error: '0.0' - パラメータは参照として渡され、変数は を期待する。

 
Igor Makanu:

キャスティングに関するもう一つの質問

このコードがあります。

で、クラス B をパラメータなしのコンストラクタで初期化したいのですが、SHash 構造体をコンストラクタ SHash(const double) にキャストできないのです。

つまり、キャスティング(SHash)ダブルが必要です。

この例では、コンパイラーエラーが発生します: '(SHash)' - invalid cast operation


このように書くと

error: '0.0' - パラメータは参照として渡され、変数は を期待する。

class B:BASE
{
public:
   B():BASE(SHash())                      {  }
};
 
Vladimir Simakov:

こうなる

しかし、SHash構造体には0xAAAAAAAA初期化が必要 - これはある種のNULL - テスト文字列からMD5ハッシュを取得できない (確認済み)

SHash()コンストラクタは、今は必要ないようですが、数日前は必要だったようです )))で、最初はなかったんだけど、この空のコンストラクタとか、構造体の比較時とか、初期化時とか、どこかのコンパイル エラーを修正したんだけど...。蓋然性が高いすべての変数を初期化するのが鉄則のようですが......。

一般的に、私は、私は、バリアントまたは曖昧でないを持っていた希望 - いいえ ))) 。)

 
Igor Makanu:

こうなる

しかし、SHash構造体には0xAAAAAAAA初期化が必要 - これはある種のNULL - テスト文字列からMD5ハッシュを取得できない (確認済み)

SHash()コンストラクタは、今は必要ないようですが、数日前は必要だったようです )))で、最初はなかったんだけど、この空のコンストラクタとか、構造体の比較時とか、初期化時とか、どこかのコンパイル エラーを修正したんだけど...。蓋然性が高いすべての変数を初期化するのが鉄則のようですが......。

一般的に、私は、私は、バリアントまたは曖昧でないを持っていた希望 - いいえ ))) 。

SHash(0.0)

が、自分で当てるのか(笑)))

 
Vladimir Simakov:

が、自分で推測するのか?)

SHash((double)x)
 
Vladimir Simakov:

と自分で推測するのか)))

class B:BASE
{
public:
   B():BASE(SHash(0.0))                      {  }
};

やばい、効いてる!

私もその方法でやってみたと思うのですが、なぜかうまくいかなかったんです。

ありがとうございます。

悪い意味でメチャクチャ((

 
Alexandr Andreev:

そうだ、クラスのコンストラクタで xを取得するのはどこなんだ?)

 
Vladimir Simakov:

そうだ、クラスのコンストラクタで xを取得するのはどこなんだ?)

ポイントは、x)ではなく、受信側に浮きがある可能性があること、0.0だけでは信頼性がないことです。

 
Alexandr Andreev:

ポイントはx)ではなく、受信機にはdubleの他にfloatが存在する可能性があり、0.0だけを指定するのも信頼性がないことです

とはいえ、こんな細かいことまで......。然程重要でない

 
Alexandr Andreev:

というのは、xのことではなく、dubleの受信には浮きがあるので、0.0だけを指定するのも信頼性がない。

そこで何を初期化するかは問題ではなく、int でもよい - このコンストラクタを呼び出すための任意の数

と、誤植を避けるために0.0を選びました。どんな数字でも、つまり0.0. は123より書きにくく、誤植しにくいのです。