快速创建对象并通过父类访问

问题描述 投票:0回答:1

目前,我的类结构如下:

 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正确定义(存在变量“初始化”)。当前,我收到错误消息“这不是包含结构中定义的字段名称”。从打印命令。

我觉得我已经接近了,但是我无法使它正常工作。我该怎么做?

oop fortran
1个回答
0
投票

您可以通过使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
© www.soinside.com 2019 - 2024. All rights reserved.