Определение и вызов конструктора в Фортране - PullRequest
0 голосов
/ 11 октября 2018

Я не могу понять, как определить простой конструктор для класса.То, что я хочу сделать, это выделить массив в mytype, а затем заполнить его в основной программе.

У меня есть следующее:

module types
    implicit none

    type mytype
        real, allocatable :: someArray(:)
    end type mytype

    interface
        module procedure :: init
    end interface

contains
    subroutine init(this)
        class(mytype), intent(inout) :: this
        allocate( this%someArray(5) )
    end subroutine init
end module types

program test
  use types
  implicit none

  type(mytype) :: array

  call array%init
  do i=1, 5
    array%someArray(i) = real(i)
    print *, array%someArray(i)
  end do
end program test

Когда я компилирую, я получаю ошибку

Ошибка: МОДУЛЬНАЯ ПРОЦЕДУРА в (1) должна быть в общем интерфейсе модуля

Что это значит?Как я могу определить общий интерфейс модуля ?

Спасибо!

1 Ответ

0 голосов
/ 11 октября 2018

Модель языка для предоставленного пользователем конструктора - это универсальная функция с тем же идентификатором, что и тип, которая просто возвращает объект типа.Помимо возможности иметь универсальный объект с тем же именем, что и тип, в этом нет ничего особенного.

module types
  implicit none

  type mytype
    real, allocatable :: someArray(:)
  end type mytype

  interface mytype
    module procedure :: init
  end interface
  ! init would typically be private.
contains
  function init()
    type(mytype) :: this
    allocate( this%someArray(5) )
    ! Non-pointer function result must be defined.
    this%someArray = 0
  end function init
end module types

program test
  use types
  implicit none

  type(mytype) :: x

  x = mytype()

  do i=1, 5
    x%someArray(i) = real(i)
    print *, x%someArray(i)
  end do
end program test

(Пример несколько бессмыслен, учитывая другие аспекты языка, такие как параметризованные типы, конструкторы массивов,автоматическое выделение или даже встроенная возможность встроенных конструкторов структуры.)

Сообщение об ошибке от компилятора, возможно, означает ссылку на общий интерфейс, поскольку оператор процедуры разрешен только винтерфейсный блок для универсального.

Ссылки на определенные привязанные к типу процедуры - вещи с синтаксисом object % binding - обычно используются, когда у вас есть родительский тип, у которого есть метод с определенной сигнатурой (набор фиктивных аргументов, за исключением переданного аргумента), иВы хотите переопределить этот метод в расширениях, то есть вызвать другую процедуру с такой же сигнатурой.Конструкторам это не подходит - обычно информация, которую нужно передать конструктору (т. Е. Подпись вызова), зависит от типа.

...