Fortran派生类型实例的用户自定义构造函数

Fortran派生类型实例的用户自定义构造函数

问题描述:

这是我关于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://*.com/问题/ 4262253 /如何重写结构构造器中的fortran和其他相关的问题和答案? Wildcat的答案包含*很多材料,甚至与C++和Java进行比较。我不认为重复所有这些都是有用的,所以最好缩小你的问题范围。 –

+0

1和2都可以在实践中使用。我更喜欢1。 3.不是Fortran,而是Lahey的一些特定语言。 Fortran中的OOP比C++中的OOP(统计OOP程序员的数量)要少得多,你不能期待这么多形式化的规则。人们仍然在找到他们最好的方法。另外不要忘记,*基于观点的问题在Stack Overflow *中是无关紧要的。 –

+0

@VladimirF,是的,的确,我的一些想法实际上来自于Wildcat的答案。 – Chang

好的,所以我会假设你在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.)