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++|详解类成员指针:数据成员指针和成员函数指针及应用场合