どのようにオーバーライド構造のコンストラクタではfortran
-
27-09-2019 - |
質問
で現できるオーバーライド構造のコンストラクタFortran?れによって提案事例このようななどのFortran2003年スペック):
module mymod
type mytype
integer :: x
! Other stuff
end type
interface mytype
module procedure init_mytype
end interface
contains
type(mytype) function init_mytype(i)
integer, intent(in) :: i
if(i > 0) then
init_mytype%x = 1
else
init_mytype%x = 2
end if
end function
end
program test
use mymod
type(mytype) :: x
x = mytype(0)
end program
この原則を生成するヒープの誤差による冗長変数名(例:エラー:由来の属性のmytype'紛争手続き属性の(1)).るバーベイタムのコピーをfortran2003例を同様のエラー。たこパスの設定を行4.4,ifort10.1、11.1、それらはすべてのエラー。
私の質問:それとも、単に未実装のfortran2003?はんこの誤?
編集:私ア バグ報告 や 発表したパッチ に降に関してこの問題です。しかし、たって利用月のgcc46せていただく貴重な機会と同様。
編集2:上記のコードが表示される作業用Intel Fortran12.1.0.
解決
Fortran 2008 Standardのコピーを相談しました。これにより、派生型と同じ名前の汎用インターフェイスを定義できます。私のコンパイラ(Intel Fortran 11.1)はコードをコンパイルしないので、これはFortran 2003標準のまだ明らかにされていない機能であると疑っています(2003年の基準のコピーなし)。
それに加えて、プログラムにエラーがあります。あなたの関数宣言:
type(mytype) function init_mytype
integer, intent(in) :: i
関数仕様に存在しない議論の存在と意図を指定します。
type(mytype) function init_mytype(i)
他のヒント
で現できるオーバーライド構造のコンストラクタFortran?
No. とにかくものをご利用のアプローチは完全なコンストラクタをオーバー.があったことなどが主な要因構造のコンストラクタ#OOPコンストラクタです。にあるとの類似性がこのうち、いくつかのアイデアです。
できませんので使用の非固有の機能の初期化を表現。のみでの使用も可能ですが一定なのに対し、配列や構造のコンストラクタ固有の機能...詳しい情報につきましては、見7.1.7初期化表現Fortran2003年。
その事実を考慮に入れた全くわからないかの違い
type(mytype) :: x
x = mytype(0)
や
type(mytype) :: x
x = init_mytype(0)
そして全体のインタフェースブロック内mymodモジュールです。
でも正直に違いがあり、大きな一つの方法は、誤解に繋がります。この機能ではないコンストラクタがありませんOOPコンストラクタですべてのFortran)で初期化.
の主流OOPコンストラクタが順番にやっては二つのことをやろうとしてい
- メモリ割り当て.
- 会員が設定する処理です。
今でもスをインスタンス化教りることができます。
に Java:
MyType mt = new MyType(1);
非常に重要な事実が用意されているため、このオブジェクトが実際にポインタをvaribaleのクラスタイプです。に相当する C++ ます 分配がヒープ 利用:
MyType* mt = new MyType(1);
がユネスコアジア太平洋の言語からわかるように、いくつか二つのコンストラクタに業務に反映でも構文です。とまではいかなくても、まず:キーワード(割当)、コンストラクタの名前(初期化).に Objective-C 書式はこの事実はもっと強調:
MyType* mt = [[MyType alloc] init:1];
多くのかを見ることができますその他の形式のコンストラクタの呼び出し.の場合 分配スタックC++ 特殊(も)構文を建設
MyType mt(1);
することであり、それは、を表示一部のエリアを表示できるだけではないと考えるのです。
に Python
mt = MyType(1)
両方の実際のオブジェクトが実際にポインタとその配置ずれ(文法)です。は、このメソッドが呼び出される... __init__
!筋なので、誤解に繋がります。С++スタックの配分は薄れとは比べものにします。=)
とにかく、やらせようという考えに コンストラクタ 言語の意味をこする能力を有すること 分配の初期設定の一つの声明 ある特別な種類の方法です。やればですが、そこにとどまることなく"true OOP"って悪い知らせがあります。も Smalltalk ないコンストラクタ.それだけで、条約について new
方法の授業を自ら(シングルトンオブジェのメラ.の 工場デザインパターン 使用その他の多くの言語を同じ目標です。
を読んでどこかにその概念のモジュールFortranたModula2のとおりとする。るようになったように思うOOPレイルミネーション オベロン-2.がないコンストラクタ、オベロン-2もございますもちろんの純粋な配分とpredeclaredの手順で新しいような配分をFortranでの配分は、決算).後に配分できる(実際に)と呼初期化子であるだけで通常の方法です。ていかなければなりません。
利にご利用いただけます何らかの工場を初期化します。こういった用モジュールの代わりにシングルトンオブジェクト。やまとおっしゃる(Java/C#/...プログラムの利用シングルトンオブジェの方法ではなく通常の機能が不足し、後(モジュール-ようにして通常の機能だけます。
も利用できるタイプ結合型です。
MODULE mymod
TYPE mytype
PRIVATE
INTEGER :: x
CONTAINS
PROCEDURE, PASS :: init
END TYPE
CONTAINS
SUBROUTINE init(this, i)
CLASS(mytype), INTENT(OUT) :: this
INTEGER, INTENT(IN) :: i
IF(i > 0) THEN
this%x = 1
ELSE
this%x = 2
END IF
END SUBROUTINE init
END
PROGRAM test
USE mymod
TYPE(mytype) :: x
CALL x%init(1)
END PROGRAM
INTENT(OUT)
のための this
argの init
互います。るものと見込まれるため、このメソッドが呼び出される一度だけと、その直後の配分についてうに制御することを前提は間違っています。トboolean flag LOGICAL :: inited
へ mytype
, チェックの場合 .false.
に設定して .true.
初めて初期化し、いようにする試みを再設定する処理です。ただ一部のスレッドでGoogleグループ---できないそれを見いだすのです。