gpt4 book ai didi

oop - 多态父派生类型

转载 作者:行者123 更新时间:2023-12-04 18:00:35 24 4
gpt4 key购买 nike

我正在尝试设置一个 Fortran OOP 代码,其中父类型 geom 具有可分配字段 shape。此字段分配有 geom 的扩展类型之一,它们是 circlerectangle 类型。在另一个模块中,我有一个 body 类型,其中包含一个 geom 字段。

所以基本上我想要一个 geom 类型,它实际上可以访问不同的类型(然后将根据类型访问不同的字段)和一个初始化的 body 类型与几何。

找到下面的代码。这是几何模块:

module geomMod

implicit none

type :: geom
class(*),allocatable :: shape
contains
procedure,private :: set_geom
generic :: assignment(=) => set_geom
end type geom

type,extends(geom) :: circle
integer :: id=1
real :: centre(2)
real :: radius
end type circle

type,extends(geom) :: rectangle
integer :: id=2
real :: centre(2)
real :: length(2)
end type rectangle

contains

subroutine set_geom(a,b)
implicit none
class(geom),intent(inout) :: a
class(*),intent(in) :: b

allocate(a%shape,source=b)
end subroutine set_geom

end module geomMod

这是正文模块:

module bodyMod
use geomMod
implicit none

type :: body
class(geom),allocatable :: geom1
real,allocatable :: x(:,:)
integer :: M=50
real :: eps=0.1
contains
procedure :: init
end type body

contains

subroutine init(a,geom1,M,eps)
implicit none

class(body),intent(inout) :: a
class(geom),intent(in) :: geom1
integer,intent(in),optional :: M
real,intent(in),optional :: eps

allocate(a%geom1,source=geom1)

if(present(M)) a%M = M
if(present(eps)) a%eps = eps
if(.not.allocated(a%x)) allocate(a%x(a%M,2))
end subroutine init

end module bodyMod

这就是我从主文件初始化它们的方式:

  use bodyMod
implicit none

integer,parameter :: M = 500
real,parameter :: eps = 5

type(body) :: b
type(geom) :: geom1

geom1 = circle(centre=(/1,1/),radius=0.5)

call b%init(geom1=geom1,M=M,eps=eps)

但是我在使用 gfortran 4.8.4 编译时遇到了这个错误。

  geom1 = circle(centre=(/1,1/),radius=0.5)
1
Error: No initializer for component 'shape' given in the structure constructor at (1)!

最佳答案

您的结构构造器 circle 仅使用指定的两个组件的值进行引用

geom1 = circle(centre=(/1,1/),radius=0.5)

你的编译器不喜欢这样。

circle 类型有四个组成部分,shapeidcentreradius。在对结构构造函数的引用中,并不总是需要为所有组件提供值,这里有两种情况适用。

第一种情况是组件具有默认初始化。正如您所做的那样,您完全有权省略组件 id 的值。

第二种情况是针对可分配组件。这就是问题所在:Fortran 2003 和 Fortran 2008 标准之间的规则发生了变化。

在 Fortran 2008 下,允许省略对应于可分配组件的值。在 Fortran 2003 中不是。

您的编译器错误表明它在这方面遵循 Fortran 2003 的规则,并且它需要可分配组件 shape 的值。 gfortran 是 such a compiler .

要提供这样的值,不分配组件,可以有

geom1 = circle(shape=NULL(),centre=(/1,1/),radius=0.5)

关于oop - 多态父派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36061032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com