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

 
fxsaber:

祖先」はprotected/privateフィールドを見るので、見てはいけない。

そして、パブリックフィールド:すべき/すべきでない?

コンビナート です。

を追加すると

構造体B

効果なし
 
A100:

そして、公開:すべき/すべきでない?

public static field - must.
 
fxsaber:
public static-fieldは必須です。
要約すると、ベースクラスは派生クラスの非スタティックフィールドを見ることができません。同時に、ベースクラスには派生物のprotected staticは表示されず、public staticが表示されます。このルールはご自身で考案されたのですか?
 
A100:
要約すると、ベースクラスは派生クラスの非静的フィールドを見ることができません。同時に、ベースクラスには派生クラスのprotected staticは表示されず、public staticが表示されます。このルールはご自身で考案されたのですか?

このような一般論がどこにあるのか、私にはわかりません。私自身は、そういう意識は一切なかったですね。

任意のクラスは、他のクラスのパブリックな静的フィールド/メソッドを見ることができます。

ベースクラスは、派生クラス(パブリック継承)のprotected/private(static - 何でも)フィールド/メソッドを見ることはありません。

派生クラス(public-inheritance)は、ベースクラスのprivateフィールド/メソッドを見ることはなく、常にprotected/publicを見ることができます。

 
fxsaber:

どのクラスも、他のクラスのパブリックな静的フィールド/メソッドを見ることができます。

結局、問題はここに行き着くのです。MQLでは、派生クラスのpublic staticフィールド/メソッドは、ベースクラスで利用可能ということでよろしいでしょうか?
 
A100:
結局、問題はここに集約されるのです。MQLでは、ベースクラスは派生クラスのpublic staticフィールド/メソッドを持つということでよろしいでしょうか?

これは基底/微分の場合だけでなく、どのようなクラスでも一般的に正しいことです。

 
fxsaber:

これは基底/微分の場合だけでなく、すべてのクラス一般で正しい。

問題は何もないところから発生したのではない

#ifdef __cplusplus
struct B;
struct A {
        int f() { return B::i; } //error E2451
};
struct B : A {
        static int i;
};
int B::i;
#endif
ので、詳細なチェックが必要です。
 
fxsaber:

任意のクラスは、他のクラスのパブリックな静的フィールド/メソッドを見ることができます。

...ベースクラスを含む。したがって、MQLでは次のような矛盾が生じる。

struct A {
        static int i;
};
int A::i;
struct B : private A {};
struct C : B {
        C() { Print( A::i ); } //error: 'i' - private member access error
};
C++でエラーなし
 
A100:

C++では構造体のメンバはデフォルトでpublicですが、mqlではprivateで、クラスと同じです。

そうです、C++の前方宣言が抜けていて、定義が必要でした。

 
A100:

...基本的なものを含む。したがって、MQLでは次のような矛盾が生じる。

C++でエラーなし

はい、これはMQLのプライベート継承のバグです。