2

Fortran 2003 では、抽象型のコンポーネントを持つ構造型を定義できますか? たとえば、次のように、 typeSupのコンポーネントo_Abstを持つ型を定義したいとしますAbst

TYPE, ABSTRACT :: Abst
 CONTAINS 
   PROCEDURE(some_proc), deferred, pass :: some_proc 
   ..
END TYPE Abst

TYPE :: Sup
   PRIVATE
   CLASS(Abst) :: o_Abst
   ..
 CONTAINS
   PROCEDURE :: another_proc
END TYPE Sup

私がすでに遭遇した問題の 1 つは、Sup型オブジェクトのコンストラクターを作成する際に発生したものです。o_Abst組み込み代入でコンポーネントに値を代入できません=(Intel コンパイラは、「組み込み代入ステートメントでは、変数はポリモーフィックであってはなりません」と言います)。Abstまたは、渡されたオブジェクトの仮引数以外の引数が抽象型である場合、遅延型バインドプロシージャを適切にオーバーライドできないため、型オブジェクトのコンストラクターを作成できません。

のような型の使用を回避する回避策についてもお知らせいただければ幸いSupです。抽象型のコンポーネントを使用して型を定義したくなる場合、一般的な代替戦略は何ですか?

4

1 に答える 1

6

派生型には、抽象宣言型を持つ多形コンポーネントが含まれる場合があります。コンポーネントには、pointer属性またはallocatable属性のいずれかが必要です。

ポリモーフィックオブジェクトへの固有の割り当ては、F2003では許可されていません(割り当てられるオブジェクトに割り当て可能な属性がある場合はF2008で許可されますが、ifort 12.1はそれをサポートしていません)。F2003では、SOURCE指定子を含むALLOCATEステートメントを使用して、ほぼ同じ結果を得ることができます。

の非抽象拡張である型を持つオブジェクトを構築できますAbst(オブジェクトの動的型が抽象であることは意味がないため、それAbst自体の構造コンストラクターは存在しません)。抽象型の1つ以上の引数を取る型にバインドされるプロシージャに制限はありません。

于 2012-08-01T03:05:16.030 に答える