問題タブ [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.

0 投票する
3 に答える
169 参照

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 : '::' の右側の不正なトークン }

0 投票する
1 に答える
1533 参照

c++ - 基本サブオブジェクトにアクセスするためのドットまたは矢印演算子とスコープ解決演算子

C++

Base基本クラスと派生クラスが与えられた場合、のDerivedコンストラクターによって最初に構築されるDerivedのはBaseサブオブジェクトです。これはサブオブジェクトと呼ばれるため、オブジェクトでドット演算子を使用することにより、他のメンバー オブジェクトと同様にクライアント コードからアクセスできると想定しましたDerivedDerivedまた、 によって の実装コードからアクセスできると仮定しましたthis->Base。セミコロンが後に続く、既に初期化されているオブジェクトの名前だけで構成されるステートメントは、コンパイルする必要がありますが、効果はありません。そのロジックに従って、Derivedobjectを指定して、次のmyderivedことを試しました:myderived.Base;クライアント コードthis->Base;内およびDerivedの実装内で、どちらのステートメントもコンパイルされません。

なんで?Baseは、それ自体がBaseクラスの名前であり、オブジェクトの名前ではないことを知っていBaseます。しかし、 (クライアント コード) または(実装コード) プレフィックスBaseによって修飾されたものは基本サブオブジェクトを参照すると思いました。以下のコードを参照してください。これは (コメントアウトされたコードは別として) VC12 および g++ 4.8 で動作します。extendsとの定義はデータ メンバーを宣言するので、私のオブジェクトには 2 つが含まれている必要がありますmyderived.this->BaseBaseDerivedDerivedBaseDerivedBasemembaseDerivedBaseオブジェクト。コンパイルの成功がコンパイラ標準の不適合の結果ではないと仮定すると、2 つの異なるオブジェクトのintメンバーに異なる値を示すコンソール出力 (コメント内) は、 inの ctor 初期化子が継承されたサブオブジェクトは、宣言されたデータ メンバー オブジェクトを参照します。の ctor 初期化子では、オブジェクトやクラスだけでなく、継承されたサブオブジェクトを具体的に参照します。nBaseDerivedBaseBasemembaseDerivedBaseBaseBase

  1. 繰り返しますが、継承されたサブオブジェクトを一意に参照してコンパイルするべきではありませんmyderived.Base;か?this->Base;Base

  2. は、サブオブジェクト、クラス、または何かを参照していBaseますか?myderived.Basethis->BaseBaseBase

  3. 一般に、継承された基本サブオブジェクトは派生クラスのデータ メンバーと見なされますか?

  4. の観点から、Derivedのコンストラクター初期化子のBaseコンテキスト内で継承されたサブオブジェクトのみを参照し、の ctor 初期化子の外側のクラスのみを参照しますか?DerivedBaseDerived

  5. の実装コードとクライアント コードで「Baseオブジェクトの継承されたサブオブジェクト」Derivedを表現するにはどうすればよいでしょうか。BaseDerivedDerived

  6. でスコープ解決演算子を使用すると、myderived.Base::foo()foo()のメソッドでありBase、VC12 および g++ 4.8 でコンパイルされます。とドット演算子で修飾されているため、これBaseは のデータ メンバであることを意味しますか? もしそうなら、それはクラスですか、それともサブオブジェクトですか?myderivedmyderivedBaseBaseBase

  7. しかしmyderived.Base.foo()、コンパイルされません。オブジェクトのメンバーのAFAIKアクセスは、オブジェクト名とドット演算子によってクライアントコードで修飾されています。オブジェクト名とドット演算子の代わりに、スコープ解決演算子によって修飾される 2 種類のものは、(a) 名前空間に属するものへの外部アクセス、および (b) 静的データ メンバーの名前とメンバー関数の名前です。クラス定義の外側で定義された定義の場合、 のBase前にあるはインスタンスではなくクラス::を参照します。これは in が名前空間であるか、クラスを参照していることを意味しますか?BaseBaseBasemyderived.Base

  8. もしそうなら、それは名前空間であるか、それとも::のメンバーが後に続くかどうかに基づいて条件付きのクラスを参照していますBaseか?

  9. #7 の答えが「はい」の場合、その理由は何ですか? 次のロジックとは矛盾しているように思われます: 名前空間で 1 つの変数を囲んでも、それ自体では、名前空間がその変数の型の他のインスタンスを囲んだり構築したりすることはできません。名前空間は、その型のインスタンスを 1 つだけ所有します。つまり、その型に含まれる変数です。静的データ メンバーのように、クラスの一部であるメンバーにも同じことが言えます。このクラスは、その型のインスタンスを 1 つだけ所有します。つまり、クラスに含まれる静的データ メンバーです。対照的に、クラスのインスタンスと同じ数の同じ名前の非静的データ メンバーがクラスに存在します。

  10. 指定されたメソッドh()およびオブジェクトは、VC12 および g++ 4.8 でコンパイルされます。さらに、g++ 4.8 では、 のように、そのステートメントで任意の数の余分な s を使用できます。このようなステートメントは、 が のメンバーであることを暗示しているようです。しかし、VC12 は. しかし、 objectが与えられた場合、VC12 は問題なくコンパイルされます。これは、VC12 がクラスをそれ自体のメンバーとして扱っても問題ないことも意味します。しかし、それは、以前の声明を編集できないことと矛盾しています。また、VC12 は、任意の数の余分なs (たとえば) を持つのバージョンをコンパイルできませんが、g++ はコンパイルできます。もしあれば、どのコンパイラが正しいですか?BaseDerivedmyderivedmyderived.Base::h();Base::myderived.Base::Base::h();BaseBaseerror C3083: '{ctor}': the symbol to the left of a '::' must be a typeBasemybasemybase.Base::h();mybase.Base::h();Base::mybase.Base::Base::h()

  11. いずれにせよ、それは名前空間またはクラスがそれ自体を含むことができるということですか? intグローバル変数が与えられた場合x、ステートメント::::x;(2 つのスコープ解決演算子を含む) はどちらのコンパイラでもコンパイルされないため、グローバル スコープにはグローバル スコープが含まれていないと想定しています。

0 投票する
1 に答える
664 参照

c++ - テンプレート クラス内の静的関数またはポインターへのスコープ解決

私は現在、他の誰かが書いたいくつかのコードに取り組んでおり、その方法の効率がよくわかりません。それらには、テンプレート化されたクラスへのポインターを持ち、その方法でアクセスする代わりに、スコープ解決を使用してクラスのメンバーにアクセスするテンプレート クラスがあります。例えば:

個人的には、テンプレート クラスが理解しにくくなっていると感じていますが、クエリの主な領域はパフォーマンスです。どちらがより効率的ですか。スコープ解決を使用するか、プライベート メンバー変数を持ち、?を使用して の関数をA::T* p_blah呼び出すBp_blah->DoSomething()

0 投票する
4 に答える
2159 参照

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 構造を持つ方法はありますか?

0 投票する
1 に答える
68 参照

php - PHPのスコープ解決演算子の前のアンパサンド

はじめまして、phpについて質問させていただきます。解決策を得るためにWebで何度も検索しましたが、まだ見つかりません。私はこのようなコードを見てきました:

の前にアンパサンド記号を使用する必要があるだけですMail::factory

0 投票する
4 に答える
115 参照

c++ - :: 演算子は、修飾名ルックアップのスコープ解決とは異なるコンテキストで表示できますか?

修飾名ルックアップの目的で使用される既知のスコープ解決演算子として。しかし、によって返される値は何::ですか? 私が理解したように、それは後置単項演算子です。次の点を考慮してください。

その振る舞いを説明できますか?