gpt4 book ai didi

派生类型的构造函数

转载 作者:行者123 更新时间:2023-12-02 06:46:39 24 4
gpt4 key购买 nike

我正在尝试为 solve this other question 的抽象类型的派生类型编写一个构造函数,但似乎它不起作用,或者更好的是,它根本没有被调用。

目的是让运行时多态性设置动物的正确腿数。

这是两个模块:

动物

module animal_module
implicit none

type, abstract :: animal
private
integer, public :: nlegs = -1
contains
procedure :: legs
end type animal

contains

function legs(this) result(n)
class(animal), intent(in) :: this
integer :: n

n = this%nlegs
end function legs

module cat_module
use animal_module, only : animal
implicit none

type, extends(animal) :: cat
private
contains
procedure :: setlegs => setlegs
end type cat

interface cat
module procedure init_cat
end interface cat

contains

type(cat) function init_cat(this)
class(cat), intent(inout) :: this
print *, "Cat!"
this%nlegs = -4
end function init_cat

主程序

program oo
use animal_module
use cat_module
implicit none

type(cat) :: c
type(bee) :: b

character(len = 3) :: what = "cat"

class(animal), allocatable :: q

select case(what)
case("cat")
print *, "you will see a cat"
allocate(cat :: q)
q = cat() ! <----- this line does not change anything

case default
print *, "ohnoes, nothing is prepared!"
stop 1
end select

print *, "this animal has ", q%legs(), " legs."
print *, "cat animal has ", c%legs(), " legs."
end program

构造函数根本没有被调用,并且腿数仍然保持为-1

最佳答案

cat 类型的可用非默认构造函数由模块过程 init_cat 给出。您定义的这个函数如下

type(cat) function init_cat(this)
class(cat), intent(inout) :: this
end function init_cat

它是一个带有一个参数的class(cat)函数。在您稍后的引用中

q = cat()

通用 cat 下没有与该引用匹配的特定函数:函数 init_cat 不接受无参数引用。相反,使用默认的结构构造函数。

您必须以与您的 init_cat 接口(interface)匹配的方式引用通用 cat 才能调用该特定函数。

您想要将 init_cat 函数更改为如下所示

type(cat) function init_cat()
! print*, "Making a cat"
init_cat%nlegs = -4
end function init_cat

然后您可以根据需要引用q=cat()

请注意,在原始版本中,您正在尝试“构造”一个​​ cat 实例,但您不会将此构造的实体作为函数结果返回。相反,您正在修改一个参数(已经构造)。结构构造函数旨在返回此类有用的东西。

另请注意,您不需要

allocate (cat :: q)
q = cat()

q 的内部赋值已处理 q 的分配。

关于派生类型的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58668698/

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