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

 
Andrey Barinov:

?

例ではstatic修飾子を持って いますが、これを削除すると、コンパイラは当然のように警告を出します

staticは、コンテキスト解決演算子を使って、 コードのどの部分からも アクセスできます。を、どのようなコード断片からも 得ることができます。 (最近確認していないのでスコープを覚えていませんが、ほとんどの場合、コードの一番上に記述されているように、つまり、静的メソッド/フィールドがどこで宣言されたかは関係なく、グローバルであることが予想されます)

 
Igor Makanu:

statikは、コンテキスト解決文を使って、 コードのどの部分からも アクセスすることができます...を、コードのどの 部分からでも (最近確認していないのでスコープを覚えていませんが、ほとんどの場合、コードの一番上に記述されているように、つまり、静的メソッド/フィールドがどこで宣言されていても問題ないように、グローバルになっているはずです)

いつからそうなったのでしょうか :)?

静的なもの(private, protected, public)にも同じルールが適用されますが、オブジェクトの作成が 必要ないだけです。

これは明らかなバグです。

 
Andrey Barinov:

いつからこうなったのでしょうか :)?

数ヶ月前、@Ilyas 管理者が静的変数の初期化手順について説明し、静的メソッドと静的フィールドは MQL プログラム起動時にグローバル変数と一緒に初期化されると述べたことは確かです... さらに彼の投稿を検索してください。

アンドレイ・バリノフ

静的なもの(private, protected, public)にも同じルールが適用されますが、オブジェクトの作成が 必要ないだけです。

これは明らかなバグです。

議論する気はないし、したくないが、ヘルプテキストには静的メソッドの動作が示されている

MQLのコードは、C#プログラムの動作に向けて大きく前進していますが、状況はそこでも同様です。プログラマがコンテキスト解決演算子を使用することを決定した場合、それは彼が意識的にクラス内のデータの整合性の違反を識別するためにコンパイラの助けを拒否することを意味し、コンテキスト解決演算子なしでメソッドとフィールドを取得する古典的な方法があります。


UPD: MQLライブラリを少しずつ書き直すことにしたのですが、一般的なMQLコードで見られるように、メソッドやフィールドの名前が予約語の名前と一致していることに気づいてゾッとしています...これは、依存関係を「壊す」ときにコンパイラの助けを避けるためのステップでもあるようです...。まあまあ )))

 

Igor Makanu:

プログラマがコンテキスト解決演算子を使うことを決めた場合、それはコンパイラがクラス内のデータ整合性違反を検出するのを意識的に拒否したことを意味します。コンテキスト解決演算子を使わずにメソッドやフィールドを取得する古典的な方法があります。

OOPの吸い過ぎだと思います。 一度休んで、頭をスッキリさせてから戻ってきてください。 コンテキスト解決文は、可視性を定義しますが、アクセスには影響しません。

 
TheXpert:

コンテキスト解決文は、可視性を定義するが、アクセスには影響しない。

まあ、何を吸って、いつ休むかは自分次第ですが ))))

SZY: メモリの内容にアクセスするどんな言語でも、常にたくさんのトリックがあります。 私はコメントでそこの趣味を読み、パイソンとc++についての定期的な戦いがあります、もう一度 - フィールドとメソッドを扱うより人道的な方法があります、あなたはそれが高速だと判断した場合、あなたが得るものを非難してはいけません - すべてのコンパイラであなたは常にあなたがすべきでない場所に侵入することができます))))。

 
Igor Makanu:

数ヶ月前、@Ilyas 管理者が静的初期化手順について説明し、MQL プログラム起動時に静的メソッドと静的フィールドがグローバル変数と一緒に初期化されると述べたことは確かです... さらに彼の投稿を検索してください。

議論する気はないし、する気もないが、ヘルプの文章は静的メソッドの動作を表している。

"private - あるクラスの変数やメソッドに、そのクラスのメソッドからのみアクセスできるように します。"

のみ」という言葉のどこが不明瞭なのか?

OnStartは、例によるとクラスAのメソッドではありません。

 
Aliaksandr Hryshyn:

"private - あるクラスの変数やメソッドに、そのクラスのメソッドからのみアクセスできるように します。"

のみ」という言葉のどこが不明瞭なのか?

OnStartは、例によるとクラスAのメソッドではありません。

private修飾子ではなく、static修飾 子について話しています - テストを行い、MQLでstaticがどのように動作するかを確認します。

 
Igor Makanu:

数ヶ月前、@Ilyas 管理者が静的初期化手順について説明し、MQL プログラム起動時に静的メソッドと静的フィールドがグローバル変数と一緒に初期化されると述べたことは確かです... さらに彼の投稿を検索してください。

論争する気にはなれませんが、ヘルプテキストには静的メソッドの動作が示されています。

また、MQLはC#プログラムの挙動に近づいており、同様の状況です。プログラマがコンテキスト解決演算子を使うことを決めた場合、それは、クラス内のデータ整合性の侵害を特定するためのコンパイラの助けを意識的に拒否することを意味し、コンテキスト解決演算子を使わずにメソッドやフィールドを取得する古典的な方法が存在します。


UPD: MQLライブラリを少しずつ書き直すことにしたのですが、一般的なMQLコードで見られるように、メソッドやフィールドの名前が予約語の名前と一致していることに気づいてゾッとしています...これは、依存関係を「壊す」ときにコンパイラの助けを避けるためのステップでもあるようです...。まあまあ )))

https://pikabu.ru/story/nevozmozhno_tak_nevozmozhno_2129852
 

?

クラス以外のものはずっとスタ一で動いていたのに、私が騒いでいるだけという不思議な状況です......。試しに、自分でコードを再現してみてください。

int print(int value)
{  Print(value,":",__FUNCTION__); 
 return(value);
}
class A
{
private:
   static int        a1;
protected:
   static int        a2;
public:
   static int        a3;

};
//+------------------------------------------------------------------+
static int A::a1 = print(1);
static int A::a2 = print(2);
static int A::a3 = print(3);

//+------------------------------------------------------------------+
void OnStart()
{}
//+------------------------------------------------------------------+

オブジェクトのインスタンスが表示されますか?で、MQLに存在する;)

SZZ:しかも、ヘルプのレベルで存在する...何が不満なんだ?

https://www.mql5.com/ru/docs/basis/oop/staticmembers

クラスのメンバを静的に宣言できないと、このデータをグローバルなプログラムレベルで宣言する必要が生じます。 これでは、データとそのクラスの関係が切れてしまいますし、データとそれを扱うメソッドをクラスで組み合わせるという、基本的なOOPのパラダイムとも矛盾しています。静的メンバは、個々のインスタンスに固有のものではないクラスデータを、クラスのスコープ内に存在させることができます。