2017-01-24 4 views
1

Рассмотрим this code, который представляет собой учебник для объектно-ориентированного программирования на языке Fortran:Где конструктор класса?

module class_Circle 
    implicit none 
    private 
    public :: Circle, circle_area, circle_print 

    real :: pi = 3.1415926535897931d0 ! Class-wide private constant 

    type Circle 
    real :: radius 
    end type Circle 
contains 
    function circle_area(this) result(area) 
    type(Circle), intent(in) :: this 
    real :: area 
    area = pi * this%radius**2 
    end function circle_area 

    subroutine circle_print(this) 
    type(Circle), intent(in) :: this 
    real :: area 
    area = circle_area(this) ! Call the circle_area function 
    print *, 'Circle: r = ', this%radius, ' area = ', area 
    end subroutine circle_print 
end module class_Circle 

program circle_test 
    use class_Circle 
    implicit none 

    type(Circle) :: c  ! Declare a variable of type Circle. 
    c = Circle(1.5)  ! Use the implicit constructor, radius = 1.5. 
    call circle_print(c) ! Call a class subroutine 
end program circle_test 

Я не вижу никакого конструктора для класса, так как же c = Circle(1.5) на самом деле работает? Что делать, если для класса есть больше полей, как я могу создать конструктор, который инициализирует их по умолчанию?

ответ

2

Каждый пользовательский производный тип в Fortran имеет конструктор структуры по умолчанию. Его аргументы - это просто все компоненты производного типа в том порядке, в котором они объявлены.

Некоторые типы компонентов могут быть необязательными в конструкторе по умолчанию, таком как инициализированные по умолчанию компоненты или выделяемые компоненты.

Конструктор структур - это функция, которая возвращает объект производного типа и имеет имя после производного типа. Он may be overloaded с помощью определяемого пользователем конструктора структуры.


«Что делать, если есть несколько полей для класса, как я могу создать конструктор, который инициализирует их по умолчанию?»

type obj 
    real :: a 
    integer :: n = 1 
    real, pointer :: p => null() 
    integer, allocatable :: ia 
end type 


type(obj) :: o 
real, target :: pi = 3.14 

o = obj(1.0) 

o = obj(1.0, 2) 

o = obj(1.0, p = pi) 

o = obj(1.0, ia = 4) 

все юридические. Компоненты являются аргументом конструктора по умолчанию в том порядке, в котором они объявлены, но некоторые из них являются необязательными. (Обратите внимание, что gfortran 4.8 не компилирует вышеуказанный код, но он неверен)

+0

Спасибо, я хочу создать объект-таймер, можно ли вызвать system_clock и назначить значения в поле, которое содержит кол-во макс и скорость счета в конструктор, который выполняется автоматически? – Saeid

+1

Это похоже на задачу для пользовательского конструктора http://stackoverflow.com/questions/4262253/how-to-override-a-structure-constructor-in-fortran или, возможно, нет. Я не уверен, что вы имеете в виду. –

 Смежные вопросы

  • Нет связанных вопросов^_^