假设我定义了一个名为geometry的派生类型(在Fortran2003中),并将其扩展为两个新的派生类型:circle和triangle。每种扩展类型都有自己的构造函数NewCircle和NewTriangle,分别返回circle对象和triangle对象。
那么我想这样做:
use appropriate_module
class(geometry), allocatable :: Geo(:)
allocate(Geo(2))
Geo(1) = NewCircle
Geo(2) = NewTriangle当然,最后两行在Fortran 2003标准中是无效的。我不想创建一个封装在派生类型中的指针数组来链接不同类型的对象,因为在数组中链接对象之前需要创建这些对象。在上面(假设的)情况下,对象将被立即创建并存储在数组中。
有什么建议可以这样做吗,或者这是语言的限制?
发布于 2015-06-29 18:51:34
如果需要值语义,可以使用多态可分配组件创建一个派生类型数组。
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内在函数提供了一种将构造的值移动到数组元素中的有效方法。
https://stackoverflow.com/questions/31106539
复制相似问题