Fortran:指向抽象成员函数的函数指针

Posted

技术标签:

【中文标题】Fortran:指向抽象成员函数的函数指针【英文标题】:Fortran: function pointer to abstract member function 【发布时间】:2015-03-02 20:13:40 【问题描述】:

我在使用新旧 Fortran 代码时遇到了一些问题。新部分是面向对象的,旧部分使用函数指针。

我的问题是,我想将一个成员函数分配给一个函数指针,以便该函数与这个特殊对象一起工作。下面是一个同样错误的示例代码:

module test

   ! abstract class
   type, abstract :: base      
   contains
      procedure (doSth), deferred :: doSomething
   end type base

   ! deferred function
   abstract interface
      subroutine doSth(this)
      import :: base    
         class(base)  :: this
      end subroutine      
   end interface


   ! derived class
   type, extends(base) :: child      
   contains
      procedure :: doSomething => do_Sth
   end type child

   contains
   ! deferred function implemented by child   
   subroutine do_Sth(this)
      class(child)  :: this
      ! ...
      ! ...
   end subroutine   


   ! function pointer to member function
   subroutine get_functionPointer()
      procedure() , pointer :: funcPtr
      type (child), pointer :: childPtr

      allocate (childPtr)
      funcPtr => childPtr%doSomething
      ! ... This does not work      
   end subroutine
end module 

这给了我错误信息:

error #8191: The procedure target must be a procedure or a procedure pointer.

有没有办法克服这个问题?

【问题讨论】:

Fortran 没有成员函数的概念 - 您试图将指针分配给 funcPtr 的东西是绑定。右侧相关过程的名称是do_Sth。也许阅读this 的公认答案 - 当您分配过程指针而不是进行参数关联时,类似的规则会发挥作用。 【参考方案1】:

在一些帮助下,这似乎可行:

             :
             :
  ! function pointer to member function
   subroutine get_functionPointer()
      procedure(doSth), pointer :: funcPtr
      type (child), pointer :: childPtr

      allocate (childPtr)
      call funcPtr(childPtr)
   end subroutine
            :
            :

非常感谢您的帮助。

【讨论】:

funcPtr的值怎么设置?

以上是关于Fortran:指向抽象成员函数的函数指针的主要内容,如果未能解决你的问题,请参考以下文章

如何从静态成员函数调用指向成员函数的指针?

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

C++函数指针与成员函数指针

c++怎样将指向【成员函数】的指针强转成指向【普通函数】的指针

从 C++ 的成员函数中获取指向成员函数的指针

指向函数对象的成员函数指针