目前,我的类结构如下:
type, public :: ClassA
type(ClassB), public :: ObjectB
type(ClassC), public :: ObjectC
end type ClassA
换句话说,如果我在其他地方创建ObjectA,我也会创建ObjectB和ObjectC。但我宁愿有类似的东西
type, public :: ClassA
contains
procedure, public :: CreateObjectB
procedure, public :: CreateObjectC
end type
contains
subroutine CreateObjectB(self)
class(ClassA) :: self
type(ClassB) :: ObjectB
ObjectB%initialized = 1
end subroutine
subroutine CreateObjectC(self)
class(ClassA) :: self
type(ClassC) :: ObjectC
ObjectC%initialized = 1
end subroutine
也就是说,只有创建这些对象的可能性。然后,从外部,我想动态创建对象:
type(ClassA) :: ObjectA
call ObjectA%CreateObjectB()
print*,ObjectA%ObjectB%intialized
假定ObjectB和ObjectC正确定义(存在变量“初始化”)。当前,我收到错误消息“这不是包含结构中定义的字段名称”。从打印命令。
我觉得我已经接近了,但是我无法使它正常工作。我该怎么做?
您可以通过使classA
中的对象类型为allocatable
来实现此目的,]:>
module classA_module
use classB_module
use classC_module
implicit none
type :: classA
type(classB), allocatable :: objectB
type(classC), allocatable :: objectC
contains
procedure :: init => init_classA
procedure :: check_isInit => check_isInit_classA
end type classA
contains
subroutine init_classA(this)
class(classA) :: this
allocate ( classB :: this%objectB )
allocate ( classC :: this%objectC )
! initialize objectB (sets objectB%initialized = .true. internally)
call this%objectB%init()
call this%objectC%init()
end subroutine init_classA
subroutine check_isInit_classA(this)
class(classA) :: this
if ( this%objectB%isinitialized ) then
print*,'Initialization was successful'
else
print*,'Initialization failed'
endif
print*,'this%objectB%isinitialized: ',this%objectB%isinitialized
print*,'this%objectC%isinitialized: ',this%objectC%isinitialized
end subroutine check_isInit_classA
end module classA_module
module classB_module
implicit none
type :: classB
logical :: isInitialized = .false.
contains
procedure :: init => init_classB
end type classB
contains
subroutine init_classB(this)
class(classB) :: this
this%isInitialized = .true.
end subroutine init_classB
end module classB_module
PROGRAM Main
use classA_module
implicit none
type(classA) :: objectA
call objectA%init()
call objectA%check_isInit()
end program Main