Oop Fortran中指向子级(扩展声明类型)的无限多态类

Oop Fortran中指向子级(扩展声明类型)的无限多态类,oop,linked-list,fortran,polymorphism,intel-fortran,Oop,Linked List,Fortran,Polymorphism,Intel Fortran,我正在尝试使用Fortran中的多态性来创建一个数据树结构,该结构具有类似链表的特性。每个框或对象都有一个指向其子对象的指针和一个指向其父对象的指针,这两个指针的对象类型相同。因为我想到了一个对数据树结构根的引用,所以我最初定义了一个声明的类型,如下所示: type r_oct integer :: max_depth class(*), pointer :: root end type 然后,我将其扩展到另一种类型,该类型包含此数据结构的主要属性 type, ext

我正在尝试使用Fortran中的多态性来创建一个数据树结构,该结构具有类似链表的特性。每个框或对象都有一个指向其子对象的指针和一个指向其父对象的指针,这两个指针的对象类型相同。因为我想到了一个对数据树结构根的引用,所以我最初定义了一个声明的类型,如下所示:

type r_oct 
    integer :: max_depth 
    class(*), pointer :: root 
end type 
然后,我将其扩展到另一种类型,该类型包含此数据结构的主要属性

 type, extends(r_oct) :: element_oct 
     rea                        :: pts
     type(element_oct), pointer :: parent 
     type(element_oct), pointer :: children(:)
 end type 
现在我想要两个不同的构造函数,所以我声明如下

  interface r_oct
     module procedure              :: INIT_r_oct
     module procedure              :: INIT_element_oct
  end interface r_oct
在我的函数
INIT\u r\u oct
中,我只需要

  function INIT_r_oct( max_depth ) result( oct )

  implicit none

  class(r_oct), pointer     :: oct
  integer, intent(in)       :: max_depth

  if( associated(oct) )then
     print*, "ERROR, called more than once"
     stop
  else
     allocate(oct)
     nullify(oct% root)
     oct% max_depth = max_depth
  endif
  end function INIT_r_oct
目前一切都很好。但是现在,下面的函数就是我遇到问题的地方

我的想法是让根指针指向子对象的
父对象的第一个实例,即
元素\ u oct::parent

  function INIT_element_oct (this, pts ) result( ele_oct )

  class(r_oct), pointer, intent(inout)  :: this
  real, intent(in)                      :: pts
  type(element_oct), pointer          :: ele_oct

  allocate(ele_oct)
  this%root => ele_oct
   this%root%parent%pts = 1 ! this does not work


  end function INIT_element_oct
它抱怨
this%root
没有父属性,好像它没有做我想要的
this%root=>ele\u oct

我对Fortran的这种编程方式有点陌生,所以我猜有些东西我自己还没有完全理解,我希望你能对我正在尝试做的事情提出一些更好的建议

更新

看来
select type
可以帮我解决这个问题

在函数
INIT\u element\u oct
中,我改为:

function INIT_element_oct (this, pts ) result( ele_oct )

class(r_oct), pointer, intent(inout)  :: this
real, intent(in)                      :: pts
type(element_oct), pointer          :: ele_oct

allocate(ele_oct)
this%root => ele_oct
select type ( aux => this% root) 
type is (element_oct) 
   aux = ele_oct%parent ! this now works!!!
end select
end function INIT_element_oct
但是
这个%root
现在真的指向ele_oct%parent吗?也就是说,如果您以后想要指向第一个元素的指针,我可以使用根指针来获取,因为这似乎是指向它的临时指针

有没有一种方法可以使用
deferred
类型来解决这个问题

从主程序调用

  program TEST_OCT
  use mod_oct

  implicit none

  class(r_oct), pointer      :: first
  class(element_oct), pointer :: octree

  integer                       :: i,j, max_d

  max_d = 10

  first => r_oct(max_num_point)
  oct => r_oct(first, 1.0)

不要做出返回指针的动作。曾经别这样。构造函数应该返回普通的
type()
此%root
是无限制多态的,因此没有组件。您可能需要阅读声明的/动态类型,
选择类型
,等等,并用更具体的内容细化问题(多态性的这些方面可能太广泛,无法在单个问题中涵盖)。@VladimirF,是否应该将函数定义为
类型(类名称)函数INIT\u元素\u oct(这个,pts)
?@A2LBK我看不出
这个
参数的目的。@francescalus,是的,我将这个%root定义为无限多态,因为在声明时,子类还没有明确定义。我不确定
选择类型
将如何帮助我。我的问题只是如何将
this%root
指向另一个对象,因为我在这里尝试:
this%root=>ele\u oct