【发布时间】:2020-05-09 20:42:57
【问题描述】:
目前我的类结构如下:
type, public :: ClassA
type(ClassB), public :: ObjectB
type(ClassC), public :: ObjectC
end type ClassA
也就是说,如果我在其他地方创建 ObjectA,我也会创建 ObjectB 和 ObjectC。但我宁愿有类似的东西
type, public :: ClassA
contains
procedure, public :: CreateObjectB
procedure, public :: CreateObjectC
end type
contains
subroutine CreateObjectB(self)
class(ClassA) :: self
type(ClassB) :: ObjectB
ObjectB%initialized = 1
end subroutine
subroutine CreateObjectC(self)
class(ClassA) :: self
type(ClassC) :: ObjectC
ObjectC%initialized = 1
end subroutine
换句话说,就是有可能创建这些对象。 然后,从外部,我想动态创建对象:
type(ClassA) :: ObjectA
call ObjectA%CreateObjectB()
print*,ObjectA%ObjectB%intialized
假设 ObjectB 和 ObjectC 被正确定义(变量“initialized”存在)。 目前我收到错误“这不是在包含结构中定义的字段名称。”来自打印命令。
我觉得我很接近,但我无法让它工作。我该怎么做?
【问题讨论】:
-
如果您为您提供完整的示例代码,并定义并初始化 ObjectB、ObjectC 等,一旦错误也可能存在,那就好多了。
-
另外请注意,通过在 CreateObjectB 中定义 ObjectB 的方式,ObjectB 将仅在 CreateObjectB 的特定运行期间可用。如果您希望它在子例程执行后可用,以便您可以调用
print*,ObjectA%ObjectB%intialized,您必须将其保存为 ClassA 的属性,就像您在开始时所做的那样。另一种选择是将 CreateObjectB 设置为函数并将其返回给分配函数的变量。 -
你想在另一个对象的实例中拥有不确定数量的实例和对象吗?
-
我不确定我是否完全遵循,所以这可能偏离目标:如果您希望能够创建
A而无需同时创建B和C同时,您可以将它们都设为allocatable的type A的成员,然后在需要时分配它们。或者您是否希望能够创建B并稍后将其与A关联?