1

我有以下代码:

    Module Hello
      Implicit None
    Type, Public :: TestOne
       Private
       Integer :: One, Two, Three
     contains
       Procedure, Pass, Public :: Set => SetSub
    End type TestOne
    Private :: SetSub
    Interface Assignment(=)
       Module Procedure SubgetValue
    End Interface Assignment(=)
    contains
      Subroutine SetSub(this)
        Implicit none
        Class(TestOne), Intent(InOut) :: this
        this%one=1
        this%two=2
        this%three=3
      End Subroutine SetSub
      Subroutine SubGetValue(ISOut,TSIn)
        Implicit None
        Integer, Intent(Out) :: ISOut
        Class(TestOne), Intent(In) :: TSIn
        ISOut=TSIn%one
      End Subroutine SubGetValue
    End Module Hello
    Program Test
      use Hello
      Implicit None
      Type(TestOne) :: TSTest
      Integer :: b
      call TSTest%Set()
      b=TSTest
      write(*,*) b
    End Program Test

在这个版本中,我只能通过“=”访问“TSTest%One”。问题是如何创建接口分配,以便我可以访问“TSTest%one”、“TSTest%two”或“TSTest%three”。如果“一”、“二”和“三”不是私有的,那将是微不足道的。但是,目标是保持它们的私密性并通过接口分配访问它们。任何用于访问“二”或“三”的附加模块过程都将具有相同的虚拟参数,从而导致编译时错误。

但是,解决该问题的另一种方法是“setter”/“getter”例程,但我在网上某处读到通过赋值访问 varialbe 比通过“getter”例程快得多。

有什么建议么。

谢谢

4

1 回答 1

4

您定义的分配例程与“getter”具有相同的开销 - 因为它就是这样。

如果(何时)编译器过程间优化达到标准,则不应该有任何额外的开销,特别是在 TSTest 对象不是多态的情况下。

在您编辑之前...

除了通过混合类型分配提取任何明显的单一候选之外,我首选的方法是使用单独的绑定来访问每个组件。

TYPE, PUBLIC :: TestOne
  PRIVATE
  INTEGER :: One, Two, Three
CONTAINS
  PROCEDURE :: GetOne
  PROCEDURE :: GetTwo
  PROCEDURE :: GetThree
  ...

FUNCTION GetOne(this)
  CLASS(TestOne), INTENT(IN) :: this
  INTEGER :: GetOne
  GetOne = this%One
END FUNCTION GetOne
...

b = TSTTest%GetTwo()

如果我觉得有创意,我还可以为一元“访问”运算符添加一些通用类型绑定到类型:

TYPE, PUBLIC :: TestOne
  PRIVATE
  INTEGER :: One, Two, Three
CONTAINS
  PROCEDURE :: GetOne
  ...
  GENERIC :: OPERATOR(.TheOneOutOf.) => GetOne
...

b = .TheOneOutOf. TSTTest

尽管有时这种创造力只是导致我对编译器供应商的支持渠道过于熟悉。

(考虑使定义的赋值类型绑定。)

于 2013-10-02T02:13:24.710 回答