2016-11-21 100 views
0

我用下面的代碼,朱莉婭嵌套類型初始化

abstract P0 

type P1 <: P0 
    x::Float64 
    y::Int64 
    P1()=new() 
end 


type P11 <: P0 
    z::Int64 
    p::P1 
    P11()=new() 
end 

,並做了如下分配。

P11(2211879264,#undef) 

我怎樣才能正確初始化:

pp=P11() 

我的類型P1爲以下獲得和#undef

回答

2

如果您想對字段值施加約束或需要不完整的初始化,則只需要內部構造函數。後者是你在這裏做的(注意,不僅pp.p而且pp.z未初始化)。

否則,優選使用外部構造函數,例如,用於設置字段的默認值。例如:

abstract P0 

type P1 <: P0 
    x::Float64 
    y::Int64 
end 

P1() = P1(0.0, 0) 

type P11 <: P0 
    z::Int64 
    p::P1 
end 

P11() = P11(0, P1()) 

P11() # returns P11(0,P1(0.0,0)) 
+0

我希望不完整的初始化。 z初始化,因爲我達到了它pp.z 同時我剛剛初始化他們我修改代碼爲: P11()= new(1,P1()) –

+0

我的意思是我想初始化它們的一些值先因爲我將使用從文件讀取的動態數組,並且我不希望將初始化器與文件讀取功能一起從類型定義中移出。 –

+0

對不起,我不明白。在你原來的代碼中,'p​​p.z'只是解釋恰好位於未初始化的內存位置的隨機位,因爲該字段是'bitstype'。 「P1」的字段也是如此。另一方面,'P11()。p'是一個引用,因此它是'#undef'直到你賦值,例如在構造函數中,或者由'pp.p = P1()'。此外,'P11()= new(1,P1())'會禁用默認的構造函數,因此可以更好地將其寫成外部構造函數。 – tim