問題タブ [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++ - メンバー関数内での仮想関数の呼び出し
BruceEckelによるThinkinginC++を読んでいます。第15章(第1巻)の「コンストラクター内の仮想関数の動作」という見出しの下で、彼は次のように述べています。
コンストラクター内にいて、仮想関数を呼び出すとどうなりますか?通常のメンバー関数の内部では、何が起こるかを想像できます。オブジェクトは、メンバー関数が属するクラスに属しているのか、それから派生したクラスに属しているのかをオブジェクトが認識できないため、実行時に仮想呼び出しが解決されます。一貫性を保つために、これがコンストラクター内で行われるべきことだと思うかもしれません。
ここでブルースは、オブジェクトのコンストラクター内で仮想関数を呼び出すと、ポリモーフィズムは表示されない、つまり現在のクラスの関数が呼び出されるだけで、その関数の他の派生クラスバージョンではないことを説明しようとしています。これは有効であり、理解できます。クラスのコンストラクターは、クラスが実行されているのか、他の派生オブジェクトの作成のために実行されているのかを事前に知らないからです。さらに、そうすると、部分的に作成されたオブジェクトで関数が呼び出されることになり、悲惨なことになります。
彼が通常のメンバー関数について述べている最初の文のために私の混乱が突然起こりましたが、彼は仮想呼び出しが実行時に解決されると言っています。しかし、待ってください。クラスのメンバー関数内で、別の関数(仮想または非仮想)を呼び出すと、それ自体のクラスバージョンのみが呼び出されます。例えば
上記のコードでは、A::add()
への呼び出しsubadd()
が行われると、常に呼び出しが行われ、A::subadd()
同じことが当てはまりますB
よね?では、「仮想呼び出しは、メンバー関数が属するクラスに属しているのか、それから派生したクラスに属しているのかをオブジェクトが認識できないため、実行時に解決される」とはどういう意味ですか?
彼は基本クラスポインタを介した呼び出しに関してそれを説明していますか?(私は本当にそう思う)その場合、彼は「通常のメンバー関数の内部」と書くべきではない。これまでの私の理解では、同じクラスの別のメンバー関数内からのメンバー関数の呼び出しはポリモーフィックではありません。間違っている場合は修正してください。
c++ - NULL ポインターをオブジェクトにキャストし、そのメンバー関数の 1 つを呼び出すことに実際的な利点はありますか?
わかりました、技術的にはこれが未定義の動作であることは知っていますが、それにもかかわらず、私はこれを製品コードで何度も見てきました。間違っている場合は訂正してください。ただし、この「機能」を、現在の C++ 標準に欠けている側面、つまりアドレスを取得できないこと (まあ、メンバー関数の実際のオフセット)。たとえば、これは PCRE (Perl 互換の正規表現) ライブラリの一般的な実装から外れています。
このような場合にそのような言語の微妙な点を利用することが有効かどうか、または必要であるかどうかについて議論することができますが、私はそれが次のように使用されていることも見てきました:
これはうまくいきます!の存在をテストすることでヌル ポインターの逆参照を回避し、ブロックthis
内のクラス メンバーにアクセスしようとしません。else
これらのガードが配置されている限り、それは正当なコードですよね? そのため、疑問が残ります。そのような構造を使用することでメリットが得られる実用的なユースケースはありますか? 最初のケースは言語制限の回避策であるため、2 番目のケースが特に心配です。またはそれは?
PS。C スタイルのキャストについては申し訳ありません。
c++ - 特性によってインスタンス化されたクラス メンバー関数 [ポリシー、実際]
これを理解できないとは言いたくないのですが、これを理解することはできません。Stack Overflow でググって検索したところ、何も表示されませんでした。
質問の抽象的で、おそらく非常に曖昧な形式は、メンバー関数をインスタンス化するために特性パターンを使用するにはどうすればよいですか? です。 [更新: ここで間違った用語を使用しました。「特性」ではなく「ポリシー」であるべきです。特性は既存のクラスを記述します。ポリシーは合成クラスを規定します。]この疑問は、私が 10 年以上前に書いた一連の多変量関数オプティマイザーを最新化するときに出てきました。
オプティマイザーはすべて、現在の最適なポイントから離れたパラメーター空間を通る直線パスを選択し (「更新」)、その線上でより適切なポイントを見つけ (「ライン検索」)、「完了」をテストすることによって動作します。 "条件、および実行されていない場合は繰り返します。
更新、行検索、およびおそらく完了したテストなどを行うには、さまざまな方法があります。ミックス&マッチ。異なる更新式には、異なる状態変数データが必要です。たとえば、LMQN の更新にはベクトルが必要であり、BFGS の更新には行列が必要です。勾配の評価が安価である場合は、ライン検索でそうする必要があります。そうでない場合は、関数評価のみを使用する必要があります。一部の方法では、他の方法よりも正確なライン検索が必要です。これらはほんの一例です。
元のバージョンでは、仮想関数を使用していくつかの組み合わせをインスタンス化します。一部の特性は、実行時にテストされるモード ビットを設定することによって選択されます。うん。#define で特性を定義し、#ifdef とマクロでメンバー関数を定義するのは簡単です。しかし、それは20年前のことです。奇抜な現代的な方法を理解できないのは私を悩ませています。
変化する特徴が 1 つだけある場合は、奇妙に繰り返されるテンプレート パターンを使用できます。しかし、それを特性の任意の組み合わせに拡張する方法はありません。
などを使ってやってみboost::enable_if
ました。特化した状態情報は簡単でした。this
関数を実行することはできましたが、パラメーターとして -pointerを持つフレンド以外の外部関数に頼るしかありませんでした。関数を友達にする方法、ましてやメンバー関数を作る方法さえ理解できませんでした。コンパイラ (VC++ 2008) は、常に一致しないと不平を言っていました。私は「スフィナエ、馬鹿野郎!」と叫びました。しかし、バカはおそらく私です。
おそらくタグディスパッチが鍵です。私はそのことにあまり深く入っていません。
きっと可能ですよね?もしそうなら、ベストプラクティスは何ですか?
更新:これを説明する別の試みがあります。ユーザーがカスタム オプティマイザーの注文 (マニフェスト) に記入できるようにしたいのですが、中国語のメニューから注文するようなものです - 列 A から 1 つ、列 B から 1 つなど..ウェイター、列 A から (アップデーター) 、コレスキー分解ソースで BFGS を更新します。列 B (line-searchers) から、eta が 0.4、rho が 1e-4 の 3 次補間ライン検索を行います。等...
更新: わかりました。これが私が行った遊びです。しぶしぶ提案するのは、完全に間違ったアプローチだと思うからです。vc++ 2008 では問題なく動作します。
c++ - C++のConst関数とインターフェイス
例として、次の(簡単な)インターフェイスを使用します。
ロジックは、それがメンバー関数であるGetName
べきであるが、そうではないことを指示します。const
ChangeState
ただし、これまでに見たすべてのコードは、このロジックに従っていません。つまり、上記の例では、メンバー関数GetName
としてマークされていません。const
これは怠惰/不注意ですか、それともこれには正当な理由がありますか?const
クライアントが論理的に要求されたときにメンバー関数を実装するように強制することの主な短所は何ですか?
編集:皆さんの回答に感謝します。私はそれがほぼ満場一致だと思います:怠惰/無知が私が見ているものの理由です。
oracle - ストアドプロシージャPLS-00306の引数の数
手続きの呼び出しに問題があります。Oracleスクラム
PLS-00306エラー:プロシージャの呼び出しで引数のタイプの数が間違っています。
私の型宣言プロシージャでは、以下のヘッダーのようにまったく同じ宣言があります。別のプロシージャとして実行すると、拡張可能なインデックス作成のためにODCIインターフェイスで作業すると、PLS-00306がスローされます。
f# - F#:メンバー関数を非バインド関数として使用する方法はありますか?
メンバー関数を抽出してF#関数として使用する方法はありますか?次のように書けるようにしたいと思います。
上記のコードは、[let]
c++ - 私はC++を初めて使用します。リンクリスト(追加する機能)について教えてください。
親愛なるみんな;
こんにちは、私はC++の初心者です。私が理解するのを手伝ってください:
リンクリストクラスにはどの関数を含める必要がありますか?演算子<<と>>;がオーバーロードされているはずだと思います。コードの改善(スタイル、エラーなど)を手伝ってください。よろしくお願いします。イガル。
編集:これは最初の段階にすぎません。次の段階は(うまくいけば)テンプレートを使用する予定です。
整数リスト(MyNODE.hとListDriver1.cppで囲まれている)の小さなコードを確認してください。MyNODE.h
テストドライバー:
c++ - コンテナー内のすべての要素のメンバー関数の結果を合計する最良の方法は何ですか?
次のオブジェクトがあるとします。
size
内のすべてのオブジェクトの合計を取得するための最良の方法 (最も保守しやすく、読みやすいなど)はvector<Foo>
何ですか? 解決策を投稿しますが、より良いアイデアに興味があります。
アップデート:
これまでのところ、次のことがわかっています。
- std::accumulate とファンクター
- std::accumulate とラムダ式
- 普通の for ループ
他に実行可能な解決策はありますか? orを使用して保守可能なものを作成できますboost::bind
かstd::bind1st/2nd
?
c++ - あるクラスで別のクラスのプライベート メンバーであるフレンドを宣言できないのはなぜですか?
次のコードがあるとします。
Screen
クラスがWindowMgr::relocateScreen
メンバー関数をフレンドとして宣言できないのはなぜですか? 別のクラスのこのプライベート メンバー関数を使用するScreen
のではなく、その関数が独自のプライベート メンバーにアクセスできるようにするだけです。
クラス内でのみ使用することを意図している場合、relocateScreen
関数を公開することは悪い設計になる可能性があります。WindowMgr
同様に、他の場合にのプライベート メンバーにアクセスすることが意図されていない場合Screen
、 のフレンドを作成するWindowMgr
ことは悪い設計になる可能性があります。WindowMgr
ここでどこが間違っていますか?正しいアプローチは何ですか?私は自分を馬鹿にしていますか?