ホームページ >バックエンド開発 >C++ >継承されたクラス テンプレートでのメンバーの非表示とソース コードの肥大化を回避するにはどうすればよいですか?

継承されたクラス テンプレートでのメンバーの非表示とソース コードの肥大化を回避するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 05:38:27179ブラウズ

How Can I Avoid Member Invisibility and Source Code Bloat in Inherited Class Templates?

継承されたクラス テンプレートによるメンバーの非可視性とソース コードの肥大化を回避する

この問題は、クラス テンプレート CDerived がベースから継承するときに発生します。標準 C 準拠を有効にしてコードをコンパイルすると、クラス テンプレート、CBase、および CBase のすべてのパブリック メンバーが CDerived から見えなくなります。

問題の解決策:

解決策 #1: 明示的修飾

CBase:: を使用して CDerived 内の CBase メンバーへの参照をプレフィックスします。たとえば、Fn1() は CBase::Fn1() になります。これにより、基本クラスのスコープ内で名前検索が強制的に行われ、メンバーが表示されるようになります。ただし、このソリューションではコードに多くの冗長な追加が必要となり、ソース コードの肥大化につながります。

解決策 #2: this-> Prefix

CBase メンバーへの参照の前に this-> を付けます。たとえば、Fn1() は this->Fn1() になります。これによりメンバーも表示されますが、やはり冗長なコード変更が必要になります。

解決策 3: ステートメントの使用

CDerived 内に using ステートメントを追加して、CBase メンバーをインポートします。例: CBase::Fn1; を使用します。 CBase::Fn2; を使用します。これには、CDerived で使用されるメンバーごとに using ステートメントが 1 つだけ必要ですが、すべてのメンバーをインポートする包括的なステートメントは存在しません。

解決策 4: 非標準の許可モード

コンパイラ設定で厳密な C 準拠を無効にして、名前検索の問題を抑制します。ただし、これは標準から切り離されたグローバルなソリューションであり、移植性はありません。

より簡潔なソリューション #5:

ソリューション # の冗長性を軽減するには3、マクロを使用して必要な using ステートメントを生成できます。

実装:

Boost プリプロセッサ ライブラリをインクルードし、単一の using ステートメントを生成するマクロ USING_ONE を定義します。特定の基本メンバーに対するステートメントを定義します。

指定されたすべての基本メンバーに対して一連の using ステートメントを生成するには、別のマクロ USING_ALL を定義します。

基本クラス テンプレートで、マクロ USING_CBASE を定義します。派生クラス テンプレートで使用されるすべての保護されたメンバーとパブリック メンバーの using ステートメントを生成します。

派生クラス テンプレート内で、適切な USING_CBASE マクロを使用し、前に定義したマクロを使用して必要なメンバーをインポートします。このプロセスでは最小限の検索と入力が必要であり、移植性を維持しながらソース コードの肥大化を軽減します。

以上が継承されたクラス テンプレートでのメンバーの非表示とソース コードの肥大化を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。