問題タブ [scope-resolution]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ が :: の後に const を許可しないのはなぜですか?
皆さん、
問題文 - C++ では、(静的) const をクラス スコープに限定することが許可されているため、名前空間全体を汚染する #defines を取り除くことができますか?
私の意見は NO です (次の異なる例では) 。なぜ、何が最良の代替案なのかを知りたいと思います。VS がエラー C2589 を生成する: 'const' : '::' の右側に不正なトークン
例1
//ああ
クラスA {
};
//b.cpp
「ああ」を含める</h1>
… B() { uint32_t arr[A::myConst]; // C2589! const : '::' の右側の不正なトークン }
例 2
//ああ
クラス A { … .. enum blah { ... myConst = 1234, .. }; };
//b.cpp
「ああ」を含める</h1>
... B() { uint32_t arr[A::myConst]; // C2589! const : '::' の右側の不正なトークン }
c++ - 基本サブオブジェクトにアクセスするためのドットまたは矢印演算子とスコープ解決演算子
C++
Base
基本クラスと派生クラスが与えられた場合、のDerived
コンストラクターによって最初に構築されるDerived
のはBase
サブオブジェクトです。これはサブオブジェクトと呼ばれるため、オブジェクトでドット演算子を使用することにより、他のメンバー オブジェクトと同様にクライアント コードからアクセスできると想定しましたDerived
。Derived
また、 によって の実装コードからアクセスできると仮定しましたthis->Base
。セミコロンが後に続く、既に初期化されているオブジェクトの名前だけで構成されるステートメントは、コンパイルする必要がありますが、効果はありません。そのロジックに従って、Derived
objectを指定して、次のmyderived
ことを試しました:myderived.Base;
クライアント コードthis->Base;
内およびDerived
の実装内で、どちらのステートメントもコンパイルされません。
なんで?Base
は、それ自体がBase
クラスの名前であり、オブジェクトの名前ではないことを知っていBase
ます。しかし、 (クライアント コード) または(実装コード) プレフィックスBase
によって修飾されたものは基本サブオブジェクトを参照すると思いました。以下のコードを参照してください。これは (コメントアウトされたコードは別として) VC12 および g++ 4.8 で動作します。extendsとの定義はデータ メンバーを宣言するので、私のオブジェクトには 2 つが含まれている必要がありますmyderived.
this->
Base
Base
Derived
Derived
Base
Derived
Base
membase
Derived
Base
オブジェクト。コンパイルの成功がコンパイラ標準の不適合の結果ではないと仮定すると、2 つの異なるオブジェクトのint
メンバーに異なる値を示すコンソール出力 (コメント内) は、 inの ctor 初期化子が継承されたサブオブジェクトは、宣言されたデータ メンバー オブジェクトを参照します。の ctor 初期化子では、オブジェクトやクラスだけでなく、継承されたサブオブジェクトを具体的に参照します。n
Base
Derived
Base
Base
membase
Derived
Base
Base
Base
繰り返しますが、継承されたサブオブジェクトを一意に参照してコンパイルするべきではありません
myderived.Base;
か?this->Base;
Base
は、サブオブジェクト、クラス、または何かを参照してい
Base
ますか?myderived.Base
this->Base
Base
Base
一般に、継承された基本サブオブジェクトは派生クラスのデータ メンバーと見なされますか?
の観点から、
Derived
のコンストラクター初期化子のBase
コンテキスト内で継承されたサブオブジェクトのみを参照し、の ctor 初期化子の外側のクラスのみを参照しますか?Derived
Base
Derived
の実装コードとクライアント コードで「
Base
オブジェクトの継承されたサブオブジェクト」Derived
を表現するにはどうすればよいでしょうか。Base
Derived
Derived
でスコープ解決演算子を使用すると、
myderived.Base::foo()
はfoo()
のメソッドでありBase
、VC12 および g++ 4.8 でコンパイルされます。とドット演算子で修飾されているため、これBase
は のデータ メンバであることを意味しますか? もしそうなら、それはクラスですか、それともサブオブジェクトですか?myderived
myderived
Base
Base
Base
しかし
myderived.Base.foo()
、コンパイルされません。オブジェクトのメンバーのAFAIKアクセスは、オブジェクト名とドット演算子によってクライアントコードで修飾されています。オブジェクト名とドット演算子の代わりに、スコープ解決演算子によって修飾される 2 種類のものは、(a) 名前空間に属するものへの外部アクセス、および (b) 静的データ メンバーの名前とメンバー関数の名前です。クラス定義の外側で定義された定義の場合、 のBase
前にあるはインスタンスではなくクラス::
を参照します。これは in が名前空間であるか、クラスを参照していることを意味しますか?Base
Base
Base
myderived.Base
もしそうなら、それは名前空間であるか、それとも
::
のメンバーが後に続くかどうかに基づいて条件付きのクラスを参照していますBase
か?#7 の答えが「はい」の場合、その理由は何ですか? 次のロジックとは矛盾しているように思われます: 名前空間で 1 つの変数を囲んでも、それ自体では、名前空間がその変数の型の他のインスタンスを囲んだり構築したりすることはできません。名前空間は、その型のインスタンスを 1 つだけ所有します。つまり、その型に含まれる変数です。静的データ メンバーのように、クラスの一部であるメンバーにも同じことが言えます。このクラスは、その型のインスタンスを 1 つだけ所有します。つまり、クラスに含まれる静的データ メンバーです。対照的に、クラスのインスタンスと同じ数の同じ名前の非静的データ メンバーがクラスに存在します。
指定されたメソッド
h()
およびオブジェクトは、VC12 および g++ 4.8 でコンパイルされます。さらに、g++ 4.8 では、 のように、そのステートメントで任意の数の余分な s を使用できます。このようなステートメントは、 が のメンバーであることを暗示しているようです。しかし、VC12 は. しかし、 objectが与えられた場合、VC12 は問題なくコンパイルされます。これは、VC12 がクラスをそれ自体のメンバーとして扱っても問題ないことも意味します。しかし、それは、以前の声明を編集できないことと矛盾しています。また、VC12 は、任意の数の余分なs (たとえば) を持つのバージョンをコンパイルできませんが、g++ はコンパイルできます。もしあれば、どのコンパイラが正しいですか?Base
Derived
myderived
myderived.Base::h();
Base::
myderived.Base::Base::h();
Base
Base
error C3083: '{ctor}': the symbol to the left of a '::' must be a type
Base
mybase
mybase.Base::h();
mybase.Base::h();
Base::
mybase.Base::Base::h()
いずれにせよ、それは名前空間またはクラスがそれ自体を含むことができるということですか?
int
グローバル変数が与えられた場合x
、ステートメント::::x;
(2 つのスコープ解決演算子を含む) はどちらのコンパイラでもコンパイルされないため、グローバル スコープにはグローバル スコープが含まれていないと想定しています。
c++ - テンプレート クラス内の静的関数またはポインターへのスコープ解決
私は現在、他の誰かが書いたいくつかのコードに取り組んでおり、その方法の効率がよくわかりません。それらには、テンプレート化されたクラスへのポインターを持ち、その方法でアクセスする代わりに、スコープ解決を使用してクラスのメンバーにアクセスするテンプレート クラスがあります。例えば:
個人的には、テンプレート クラスが理解しにくくなっていると感じていますが、クエリの主な領域はパフォーマンスです。どちらがより効率的ですか。スコープ解決を使用するか、プライベート メンバー変数を持ち、?を使用して の関数をA::T* p_blah
呼び出すB
p_blah->DoSomething()
javascript - PHP の :: (スコープ解決演算子) に相当する Javascript
PHP では、次のようなことができます。
次に、もちろん、次のように、クラスをインスタンス化した後にそのメソッドを呼び出すことができます。
ただし、次のように、クラスをインスタンス化せずに、メソッドをスタンドアロン関数として呼び出すオプションもあります (ただし、その関数の依存関係に注意する必要があります)。
私はそれがC ++に借用されたものだと信じています...スコープ解決演算子として知られています(PHPコードのPaamayim Nekudotayim ...)
http://en.wikipedia.org/wiki/Scope_resolution_operator#PHP
http://www.php .net/manual/en/language.oop5.paamayim-nekudotayim.php
JavaScript でそのようなことを行うにはどうすればよいでしょうか。それは不可能のようです。たぶん私はこれに間違った方法で取り組んでいます。私が達成しようとしていることを開示する必要があります...
私は単に次のような関数を持っています:
そして、私はそれが機能であることを嬉しく思います。しかし、「resetContactForm()」を実装したいのですが、何らかの方法で submitConatctForm 関数にアタッチしたいと考えています。
私はおそらくこれを行うことができることを知っています:
そして、私は自分の質問にそのように答えたでしょう...
しかし、私はこの構文が好きではなく、避けたいという事実に加えて、上記の構造をクラス定義として使用できないという事実もあります.PHPと同じではありません...だから元の質問に戻ります: クラス定義とスタンドアロン関数のコレクションとして同時に使用できる JavaScript 構造を持つ方法はありますか?
php - PHPのスコープ解決演算子の前のアンパサンド
はじめまして、phpについて質問させていただきます。解決策を得るためにWebで何度も検索しましたが、まだ見つかりません。私はこのようなコードを見てきました:
の前にアンパサンド記号を使用する必要があるだけですMail::factory
。
c++ - :: 演算子は、修飾名ルックアップのスコープ解決とは異なるコンテキストで表示できますか?
修飾名ルックアップの目的で使用される既知のスコープ解決演算子として。しかし、によって返される値は何::
ですか? 私が理解したように、それは後置単項演算子です。次の点を考慮してください。
その振る舞いを説明できますか?