如何在覆盖新函数时将私有变量值传递给声明

时间:2017-08-10 07:53:04

标签: fortran private

例如,我在type A中有moduleA的定义:

 Module moduleA
   implicit none 
   type A
        private 
        integer::N
   contains 
        ... 
        procedure,pass::f=>f1
   endtype
   private::f1
   contains
   real function f1(self,x)
        real::x(self%n)
   end function
   ...
 end Module

然后我发现我在其他模块中覆盖函数f时遇到了麻烦,因为我无法获得N的值。尽管我可以有一个方法来实现这一点,但似乎real :: x(self%get())之类的东西在声明中是不可能的。我想保持"私人"的规则。在OPP中。那么我可以选择什么?

1 个答案:

答案 0 :(得分:0)

你做不到。至少在你描述的方式。最好看一个覆盖的例子来提出其他选择。

private属性在Fortran中的工作方式不同,因此您不应直接使用其他语言中使用OOP的规则private表示不同的内容。

在Fortran中private是关于本地模块的,在C ++中它是关于派生类的。这是非常不同的,当private实际上意味着其他东西时,你不能在Fortran中使用private的C ++(或Java等)规则。

要清楚,我认为你想要这种压倒一切:

   real function f2(self,x)
        class(B) :: self
        real::x(self%get())
   end function

你得到这些消息:

private.f90(15): error #8497: Illegal use of a procedure name in an expression, possibly a function call missing parenthesis.   [GET]
        real::x(self%get())
---------------------^

        real::x(self%get())
                1
Error: 'get' at (1) should be a FUNCTION

因此编译器不会接受声明中的类型绑定过程。他们会接受一个普通的程序。

这可以在gfortran中编译,但不能在英特尔Fortran中编译。但get()必须是公开的,您可能不需要:

   real function f1(self,x)
        class(A) :: self
        real::x(get(self))
   end function

   real function f2(self,x)
        class(B) :: self
        real::x(get(self))
   end function

在ifort中我得到了

error #8383: The dummy arguments of an overriding and overridden binding that correspond by position must have the same characteristics, except for the type of the passed object dummy arguments.

这很奇怪。