質問

で現できるオーバーライド構造のコンストラクタ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コンストラクタが順番にやっては二つのことをやろうとしてい

  1. メモリ割り当て.
  2. 会員が設定する処理です。

今でもスをインスタンス化教りることができます。

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 :: initedmytype, チェックの場合 .false. に設定して .true. 初めて初期化し、いようにする試みを再設定する処理です。ただ一部のスレッドでGoogleグループ---できないそれを見いだすのです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top