問題タブ [inheriting-constructors]
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++ - コンストラクターと仮想基本クラスの継承
概念的には次のような例外クラス階層を作成しようとしています。
ExceptionBase
すべてのコンストラクターは、クラスのコンストラクターと同じに見える必要があります。派生した例外は、その型に関してのみ異なります。それ以外の追加機能はありません。上記のコードで言及されている最後の例外タイプにも、これらのコンストラクターが必要です。これは、C++11 標準の継承コンストラクター機能を使用して可能ですか? それが不可能な場合: 代替手段は何ですか?
(ちなみに: 上記のコードでは、 クラスOperationFailure
とFileDoesNotExistError
は gcc 4.8 ではコンパイルされませんでしたが、clang 3.4 でコンパイルされました。明らかに、gcc は仮想ベースの継承コンストラクターを拒否します。誰がここにいるのかを知ることは興味深いでしょう。両方のコンパイラーがクラスOperationFailedBecauseFileDoesNotExistError
を拒否しました。継承するコンストラクターは直接のベースから継承しないためです。)
c++ - C++11 継承コンストラクターとアクセス修飾子
次のレイアウトを想定しています。
Derived
ここで のコンストラクターを public として指定できるようにする必要がありますか? VC++ で次のエラーが発生します。
クラス 'Derived' で宣言されたプロテクト メンバにアクセスできません
コンパイラはここで 'Derived::Derived' を生成しました [using Base::Base 行を指しています]
'Derived' の宣言を参照してください
つまり、継承されたコンストラクターの上のアクセス修飾子を無視しています。
これは機能の制限ですか? Base
直接インスタンス化できないため (純粋仮想メソッドのため) 、クラスが public コンストラクターを持っていても意味がありません。
c++ - boost::multiprecision::mpz_int でのコンストラクター継承の失敗
から派生したクラスを作成してboost::multiprecision::mpz_int
、基本クラスのコンストラクターを継承しようとしました。
g++ 4.9.0 では、次のエラーが表示されます。
真実は、なぜこれが起こっているのか分からないということです。次の回避策は、私がやりたいことを達成します:
最初の例でエラーが発生する理由を説明できる人はいますか? 基本クラスのコンストラクターを継承し、それらに値を転送することは、ほぼ同じことを行うと思いました。私は間違っていたと思いますが、それでも違いを知りたいと思っています。
編集:私は物事を明確にします。これを達成するためのより良い方法があるかどうかはまったく気にしません(たくさんあります)。私が尋ねた唯一のことは、この場合にコンストラクターの継承が失敗した理由です。コンパイラのバグによるものですか、それとも標準のどこかにあるあいまいなルールによるものですか?
c++ - Inheriting-Constructors + In-Class-Initialization の非デフォルト コンストラクト型の失敗
プロジェクトで次のエラーが発生します。
これは私が使用しているコードです:
なぜこれが起こっているのか誰にも分かりますか?
明らかに、言語は継承されたコンストラクターの最後に初期化を追加しても構わないと思っています (既定のコンストラクターを呼び出す意思があるため)。そして明らかに、明示的に定義されたコンストラクターの最後に、デフォルト以外のコンストラクター (クラス内の初期化) への呼び出しを暗黙的に追加する意思があります。しかし、私には理解できない何らかの理由で、両方を同時に実行するつもりはありません。
この質問によると、完全な転送は実際には完全ではなく、ここでは使用しないでください。
注: 実際の場合、のコンストラクターB
ははるかに複雑であり、変更される可能性があるため、手動で転送することは実際には実行可能なオプションではありません。
c++ - コンストラクターと転送の継承
C++11 では、コンストラクターを継承できるため、特にラッパー クラスのようなもので、多くのボイラープレートを回避できます。ただし、可変個引数テンプレートだけでこの機能をすでに実現できているようです。
継承コンストラクターの使用:
可変個引数テンプレートと転送の使用:
一貫性 (コンストラクターとメソッドを同じように扱うusing
) と使いやすさは、継承されたコンストラクターを言語に組み込む非常に良い理由ですが、最初のソリューションが 2 番目のソリューションよりも優先される理由は他にありますか? CWG ドキュメント ( N1890とN1898 ) の両方で、コンストラクターの継承について議論しているのを見つけました。
これを使用して、通常のメンバー関数だけでなくコンストラクターでも機能することを妨げているのは、歴史的な事故にすぎません。コンストラクターがクラスの名前で参照されるのではなく、「ctor」または「constructor」と呼ばれていれば、これは機能していたでしょう。これをコンストラクタ継承の仕組みとして提案します。
c++ - コンストラクターを継承し、新しいオーバーロードを提供する: 引数のない基本コンストラクターは、オーバーロードの解決に参加していないようです
テストは奇妙な動作を示します ( c++14
、g++ 4.9.1
、clang 3.5.5
):
要約すると:
B
使用できる他のコンストラクターがない場合A::A()
B
他のコンストラクタを提供する場合は使用できませんA::A()
が、 を使用しますA::A(whatever arguments)
。これは予期しない動作です (少なくとも私にとっては)。
セットアップ 1:
セットアップ 2:
セットアップ 3:
なぜこれが起こっているのか、どのように「修正」できますか。
c++ - 継承コンストラクターは部分的にしか機能しません
タイプ定義が何であれ、完全に機能するように記述された次のクラスがあります。
サブクラスを作成したかったのですが、オーバーロードされた typedef を除けば、実際にはほぼ同じです。
私が達成したかったのは、クラス B を作成することでした。つまり、 - A と同一 - すべての As 関数を持っています (A には、私が書いていないメンバー関数がほとんどありません) - すべての As 演算子を持っています - すべてを持っていますAs コンストラクターの - typedef が異なる - 同じデストラクタを持つ
私が欲しいものである B(void*, uint32, uint32, size_t) を呼び出すことができないため、私のコードは機能しません。(Intellisense は、使用可能なコンストラクターとして B() と B(const B&) のみを表示します)。