問題タブ [non-member-functions]
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++ - テンプレート化されたパラメーターを持つ無料の関数としてoperator==をオーバーロードする構文は何ですか?
次のようなポリモーフィッククラスのセットがあります。
そしてそれらを比較する無料の機能:
コピー可能なラッパークラスを設計しています。これにより、ポリモーフィックな動作を維持しながら、クラスを使用Red
しGreen
たり、STLマップのキーとして使用したりできます。
タイプはできるだけCopy<Apples>
互換性があるようにしたいと思います。Apples
上記のクラスに追加する必要のある関数は他にもいくつかありますがCopy
、今のところ、次のように、の無料関数に取り組んでoperator==
います。
これが私のテストコードの一部です:
しかし、コンパイラは私に言っています
上記のoperator==を認識させるにはどうすればよいですか?答えは、暗黙の変換コードをどこかに追加することかもしれないと思いますが、どうしたらよいかわかりません。
c++ - begin(コンテナ)とend(コンテナ)は標準化されていますか?
非メンバー関数テンプレートbegin(container)
とend(container)
C++0x の一部ですか? もしそうなら、それらはどのヘッダーファイルに住んでいますか?
c++ - 静的、非メンバー、または静的非メンバー関数?
「ユーティリティ」の方向にある機能を使用するたびに、どのオプションが最適かを考えてしまいます。たとえば、メッセージ構造体 (独自または外部)、エンコード/デコード コード、または作業中のコンテキストでのいくつかの便利な変換関数の出力などです。
私が考えるオプションは次のとおりです。
1) ヘルパー クラス/構造体の静的関数。
2) 非メンバー関数。
3) 静的非メンバー関数。
場合によっては、「ユーティリティ」で状態を初期化または保持する必要がある場合があるため、オプション 1 を使用して「グローバル」状態を回避します。ただし、保持する必要がある状態がない場合は、オプション 2 または 3 を使用する必要がありますか? オプション 2 と 3 の実際的な違いは何ですか?
何を考慮することが重要で、これにアプローチするための好ましい方法はありますか? ありがとう!
c# - リフレクションを介してC#からC++非メンバー関数にアクセスする
C ++プログラムに関する実行時情報を取得する必要があります。これは、C++が高度なリフレクションメカニズムを提供していないために少し難しいです。ここで、私のアプローチは、/clrを使用してC++コードをコンパイルし、C#からの結果のアセンブリを反映することです(単に、C ++よりもその言語が好きだからです)。
これは多かれ少なかれうまくいっていますが、メインメソッドを呼び出して実際にプログラムを実行する必要がある時点で立ち往生しています。私がすでにどこまで進んだかを考えると、これはちょっとイライラします...
これは問題のC++プログラムです:
特別なことは何もありません、本当に...
これは、結果のアセンブリを検査するために使用されるC#メソッドです。
さて、hello Type-arrayにはHelloWorldクラスが含まれていますが(または少なくともそのクラスだと思います)、main varには3つのタイプが含まれ、それらはすべてdoMAINを処理します(つまり、sc_mainメソッドとは関係ありません。 m探しています)。パブリックではないことと関係があると思いますが、HelloWorldクラスの静的パブリックメンバー関数を宣言しても、関数は非メンバー関数であることが予想されるため、機能しません。それとも私はひどく愚かな何かを見落としているだけですか?
c++ - フレンド関数、cpp
学校で、すべての算術演算子をオーバーロードする Matrix クラスを実装する課題がありました。私がしたことは、(たとえば) += をメンバー関数として定義し、+ を += 関数を使用する非メンバー関数として定義することでした (両方とも同じファイル内にありますが、+ クラスの外にあります)。学校のスタッフも似たようなことをしましたが、'+' をフレンド関数として宣言しました (そして += の実装も使用しました)。
両方の実装が完全に機能するため、非メンバー関数では得られないのに、フレンド関数では何が得られるのかを理解しようとしています。それぞれを優先する必要があるのはいつですか?
ありがとう!ヨタム
c++ - 非メンバー関数は複数回宣言できますが、メンバー関数は1回しか宣言できませんか?
非mumber関数は複数回削除できますが、メンバー関数は1回しか宣言できませんか?これは正しいですか ?私の例は「はい」と言っているようです。
しかし、なぜ ?
python - Python の非メンバー関数とメンバー関数
私は Python に比較的慣れていないので、言語の機能と、C++ と Java のバックグラウンドから身につけた習慣をうまく調和させるのに苦労しています。
私が抱えている最新の問題は、カプセル化に関係しています。具体的には、Meyer の「Effective C++」の項目 23 によって最もよく要約されているアイデアです。
メカニズムの欠如をfriend
少し無視して、非メンバー関数は Python のメンバー関数よりも好ましいと見なされますか?
義務的で愚かな例:
が与えられると、ベクトルの大きさを 2 倍にするまたはをv = Vector(10, 20)
呼び出すことができます。v.scale(2)
scale(v, 2)
この場合にプロパティを使用しているという事実を考慮して、2 つのオプションのどちらが優れているか (もしあれば)、そしてその理由は?
c++ - クラスVERSUS名前空間、またはクラスAND名前空間?
クラスと名前空間の両方?
この質問は、私自身がますます使用しているパターンについてです。関連する概念のクラスと名前空間の両方を持つことです。これは主にC++言語のアーティファクトによって動機付けられていると思いますが、完全ではありません。
トップレベルの質問は次のとおりだと思います。これは良い考えですか?関連する概念のクラスと名前空間の両方を持っていますか?
下位レベルの質問:
これを行うための最良の方法は何ですか?
名前空間内にネストされたクラス?:
または、個別、ピア、クラス、名前空間?:
名前空間内にクラスをネストすることに傾倒していることを認めなければなりません。それは醜い名前につながりますが。しかし、それを行ったとしても、どの命名規則を使用する必要がありますか。
以下は長すぎるため、本当に醜い名前になりますFoo_Namespace :: Foo_Class
名前にサフィックスやインジケーターを使用する必要はありません。
しかし、Foo :: bar()を見ると、それが名前空間:: Fooの無料の関数バー、つまり:: Foo :: bar()であるか、名前空間のFooクラスのメンバー関数であるかがわかりません。 :: Foo :: Foo :: bar()。
そして::Foo:: Foo :: barのような名前はまだそうではありません、うーん、いいです。
現在やっています
名前にサフィックスやインジケーターを使用する必要はありません。
主な理由は、通常、最初にクラスを作成し、後で名前空間が適切であることに気付いたためです。
何年も使用していない命名規則を復活させる必要があるのではないかと思います。クラスの場合は_c、名前空間の場合は_ns:
詳細:
上で述べたことを繰り返すことはしませんが、もう少し追加します。
クラスに加えて名前空間を使用することを私が知っている最も実際的な理由は、名前空間で自由関数の前方宣言を行うことは許可されていますが、クラスの一部のメソッドの前方宣言を行うことは許可されていないことです。つまり、クラスでは、すべてまたは何も宣言する必要があります。一般に無料の関数、特に名前空間の無料の関数では、断片的に宣言できます。パーツは、さまざまなヘッダーファイルで宣言できます。大規模なクラスの大規模なヘッダーのみのライブラリを#includeするのではなく、1つまたは2つの関数に対して前方宣言を使用できます。等。
(たとえば、 http: //google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Forward_Declarationsを参照してください。ただし、Googleはヘッダーを含めるのではなく、前方宣言に反対します。)
もう1つの理由は、名前空間によってクラス自体を小さく保つことができるためです。
クラスの最大の利点は、クラスをテンプレートに渡すことができるのに対し、名前空間は渡すことができないことです。
クラスには、Foo_ns / Foo_ns :: Foo_c / Foo_ns :: Foo_Helper_cなどのヘルパークラスが必要になることが多いため、クラスをピアFoo_ns / Foo_cとして使用するのではなく、名前空間Foo_ns / Foo_ns::Foo_c内にネストすることをお勧めします。クラスと名前空間がピアである場合、Foo_ns / Foo_cがあり、Foo_ns::Foo_Helper_cがあるのは奇妙に思えます。
Andrei Alexandresciuに同意するので、名前空間が好きです:http: //laser.inf.ethz.ch/2012/slides/Alexandrescu/1-C++%20course%20parts%201%20and%202.pdf
クラスのメソッドよりも無料の関数を作成することをお勧めします。
ただし、テンプレートなど、クラスを使用する必要がある場合もあります。
命名規則
過去にFoo_ns/Foo_ns::Foo_cを使用しました
私は今Foo_ns/Foo_ns::Fooを使用しています
(ちなみに、私はCamelCaseではなくClass_Names_With_Underscores_and_Initial_Capsを使用する傾向があります。)
理にかなっている場合は、名前空間の_nsサフィックスを削除する場合があります。たとえば、名前空間とクラスが同じ名前である必要はありません。
同じ名前にするのは嫌いです。名前空間foo内のクラスFooのコンストラクターを考えてみましょう。
:: Foo :: Foo :: Foo()vs :: Foo_ns :: Foo :: Foo()
後者はそれほど良くはありませんが、少し混乱が少なくなります。
私は通常、名前空間にネストせずに、独自にクラスを作成すると思います。実際、名前空間内にネストされたクラスの方が優れていることに気付く前に、おそらくいくつかの静的メソッドを追加します。その段階までにリファクタリングするのは苦痛かもしれません、そして私は時々転送関数を作成することになります、それはクラス静的メソッドから名前空間のfree関数に、またはその逆に転送します。これにより、ボットがステップ1から名前空間のクラスにジャンプしたことを後悔しています。
結論
私の現在のBKMはFoo_ns/Foo_ns :: Foo、つまり
提案や改善をいただければ幸いです。
それとも私はこれをするために壊れていますか?
c++ - オブジェクトに左側から定数を掛ける
私はMatrix
クラスを持っていて、それは*
スカラーと行列の乗算のためのオーバーロードされた演算子を持っています。
行列オブジェクトに右側からスカラーを問題なく乗算できます。
しかし、どうすれば左側から同じように掛けることができますか?
算術では、乗算を行うときに左側に定数を書き込むのが一般的な表記法です。コードを読みやすくするために、このルールに従いたいと思います。
これをC++で実装することは可能ですか?
可能であれば、コードのクラスメソッドを変更するにはどうすればよいですか?