假设我已经定义了一个名为geometry
的派生类型(在Fortran 2003中),并将其扩展为两个新的派生类型:circle
和triangle
。每个扩展类型都有自己的构造函数NewCircle
和NewTriangle
,它们分别返回circle
个对象和triangle
个对象。
然后我想这样做:
use appropriate_module
class(geometry), allocatable :: Geo(:)
allocate(Geo(2))
Geo(1) = NewCircle
Geo(2) = NewTriangle
当然,最后两行在Fortran 2003标准中无效。 我不想创建一个封装在派生类型中的指针数组来链接不同类型的对象,因为在数组中链接之前需要创建对象。在上述(假设的)情况下,将立即创建对象并将其存储在数组中。
是否有任何建议,或者是语言的限制?
答案 0 :(得分:1)
如果需要值语义,请使用多态可分配组件创建派生类型数组。
use appropriate_module
type geometry_element
class(geometry), allocatable :: item
end type geometry_element
type(geometry_element), allocatable :: geo(:)
geo = [ geometry_element(NewCircle()), &
geometry_element(NewTriangle()) ]
如果使用可分配参数(而不是通过函数结果)将新的geometry
对象传递回调用作用域,则MOVE_ALLOC
内在函数提供了一种将构造值移入数组的一个元素。