2017-10-04 72 views
2

這是我關於Fortran的第二個問題(我使用C++,所以請原諒我的思維方式)。Fortran派生類型實例的用戶自定義構造函數

我想在適當的時候在Fortran中使用OOP來表示派生類型。 在C++中,您可以使用用戶定義的構造函數,如https://msdn.microsoft.com/en-us/library/s16xw1a8.aspx

在Fortran中,情況有所不同。 我嘗試的第一件事是從這裏: https://www.ibm.com/developerworks/community/blogs/b10932b4-0edd-4e61-89f2-6e478ccba9aa/entry/object_oriented_fortran_user_defined_constructors2?lang=en

然後,我發現一些其他的方式來做到這一點。 這裏我列出了一些方法得體的工作,但我只測試了第一和第二:

  1. 具有相同的名稱,他們應該構建,看到上面的鏈接派生類型通用接口;
  2. 利用類型綁定過程(這甚至不是一個「傳統」的構造函數)

    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 
        write(*,*) this%x 
        IF(i > 0) THEN 
         this%x = 1 
        ELSE 
         this%x = 2 
        END IF 
        write(*,*) this%x 
        END SUBROUTINE init 
    END 
    PROGRAM test 
        USE mymod 
        TYPE(mytype) :: y 
        CALL y%init(1) 
    END PROGRAM 
    
  3. 使用靜態構造函數或結構構造函數(http://www.lahey.com/docs/lfenthelp/NLMOvUsInvConst.htm) 但現在看來,這不是一般的Fortran http://www.lahey.com/docs/lfenthelp/NLMGSWhatIs.htm

所以我還沒有很好地理解什麼是最優先和靈活的方法來初始化/構造派生類型在實踐中,特別是當我在開發中使用嵌套派生類型pment。我希望我能在一些幫助下組織這個話題。

+0

你看過https://stackoverflow.com/問題/ 4262253 /如何重寫結構構造器中的fortran和其他相關的問題和答案? Wildcat的答案包含*很多材料,甚至與C++和Java進行比較。我不認爲重複所有這些都是有用的,所以最好縮小你的問題範圍。 –

+0

1和2都可以在實踐中使用。我更喜歡1。 3.不是Fortran,而是Lahey的一些特定語言。 Fortran中的OOP比C++中的OOP(統計OOP程序員的數量)要少得多,你不能期待這麼多形式化的規則。人們仍然在找到他們最好的方法。另外不要忘記,*基於觀點的問題在Stack Overflow *中是無關緊要的。 –

+0

@VladimirF,是的,的確,我的一些想法實際上來自於Wildcat的答案。 – Chang

回答

2

好的,所以我會假設你在How to override a structure constructor in fortran上的答案很好,我會回答你在評論中提出的問題。評論中沒有足夠的地方來回答這個問題。

您還可以在Fortran中構造接受可變數量參數的構造函數。

甚至可以使用每個派生類型默認的默認結構構造函數。如果你默認初始化一個組件,它在構造函數中是可選的。同樣適用於可分配和指針組件。

對於類型

type t1 
    integer :: i = 1 
    integer, pointer :: ip => null() 
    integer, allocatable :: ap 
end type 

可以調用默認的構造就像

instance = t1() 

,這是完全合法的,i將是1,ip將指向nullap不會被分配。

或者你可以把它作爲

instance = t1(ap=5) 

ap組件將被分配並設置爲5,其他組件將保留默認值。


您只需通過將參數optional實現與用戶定義的構造類似的東西。

function t1_user(ap, i) result(res) 
    type(t1) :: res 
    integer, allocatable :: ap !this argument MUST be passed, 
          ! it does not have to be allocated 
    integer, optional :: i ! this argument is optional 

    if (present(i)) then 
    ... 
    end if 
end function 

任何類型綁定的過程當然也可以有可選的參數。


對於嵌套類型,那真是最好的構造函數作爲函數完成的,不管他們是默認或用戶定義:

type inner 
    real :: x, y 
end type 

type outer 
    type(inner), allocatable :: in 
    real :: z 
end type 

instance1 = outer(inner(1., 2.), 3.) 

instance2 = outer(z=4.) 
相關問題