問題タブ [object-construction]
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++ - 基本クラスのコンストラクターを呼び出す前に、派生クラスのメンバー変数を初期化します。これはUBですか?
Derived クラスのメンバー変数を初期化し、それを Base クラスのコンストラクターに渡したいと考えています。以下の解決策を思いつきました(ここでも:http://cpp.sh/4uu4q)
1) 次のコードには、定義済みまたは未定義の動作 (UB) がありますか?
2) 私がやろうとしていることは、設計が悪いことを示していますか?
raku - Perl6 でハッシュからオブジェクトを作成するにはどうすればよいですか?
Perl5 では、次のようなことができます。
一番下の 2 つの呼び出しは、BUILDARGS
基本的に両方を Moo(se)? が期待する一種のハッシュ参照に変換するカスタム メソッドにより、同じように機能します。
しかし、Perl6 で同じことを行うにはどうすればよいでしょうか?
では、別の場所で作成されたハッシュを、クラスのデフォルト コンストラクターが必要とする名前付き引数に変換するにはどうすればよいでしょうか?
type-conversion - Perl6 クラス属性の型強制
Perl5 のほとんどのものと同様に、属性のカスタム型強制をサポートするクラスを作成する方法はたくさんあります。配列参照からハッシュへの単純なものを次に示します。
私はこのようなものを Perl6 に移植しようとしてきましたが、必要なのは anArray
を aに強制する方法のようSetHash
です。これまでのところ、私がそれを行うことができた唯一の方法は次のとおりです。
しかし、これは正しい方法ではないように思えます。少なくとも、奇数番号のリストをコンストラクターに渡すとスクリプトが死んでしまうという細かい点についてはそうです。
では、これは Perl6 でどのように行われるのでしょうか? クラス属性のカスタム型強制を実装するための推奨される方法は何ですか (複数あると確信しているため)。
c++ - ctor-initialization-list 初期化できない値を表す
typeC
のメンバーを持つクラスを書いています。このメンバーは、インスタンスのリフトタイム全体で定義され、有効である必要があります。ただし、コンパイル時にそれを構築するために必要な情報がありません。つまり、使用できません。foo
foo_t
C
ctor ofC
が呼び出されたときにそれを構築することもできません。つまり、持つことはできません
C
むしろ、 ctor内のいくつかのコードが実行された後にしか構築できません。編集:これの理由は、構築引数を取得するために副作用(ディスクまたはネットワークI / Oなど)を伴うコードを実行する必要があるためかもしれません。また、他のメンバーを初期化できるようにするためにもそのコードを実行する必要があるため、初期化リストからフリー関数として何度も呼び出すことはできません。
では、どのように表現すればよいのfoo
でしょうか?
foo_t
ダミー/無効/空/null値でデフォルト構築できる場合は、それを発生させ、そのダミー状態では決してアクセスされないことを知って安全にすることができます。欠点: inの宣言は、それが常に有効であることを示していませんfoo
C
。有効な状態しかない場合
foo_t
、つまり、関連する情報が得られるまでまったく構築できない場合、次のようになります。- 私は使用できます
std::unique_ptr<foo_t>
。最初は でnullptr
、次に に割り当てられます。欠点: 終了後に null になることは決してないという兆候はありませんC()
。無駄な割り当て。 - 私は使用できます
std::optional<foo_t>
。最初は でnullopt
、次に に割り当てられます。不利な点: 終了後に空にならないという兆候はありませんC()
。C++14 が必要です。「オプション」という言葉は、「オプション」であることを示唆していますがfoo
、そうではありません。
- 私は使用できます
最初のケースでは、 afoo_t
の有効性に関するあいまいさが組み込まれているため、2 番目のケースにもっと興味があります。私が言及した2つに代わるより良い方法はありますか?
注: を変更することはできませんfoo_t
。