2014-02-18 152 views
1

我想將一些Scala代碼轉換爲C++,這是我第一次有任何暴露給Scala,我遇到了一些代碼的麻煩。所以,我有一個基類如下:瞭解這個Scala代碼

sealed abstract class FactorNode(factor: Factor) extends Node { 
    private var _factor: Factor = factor 
    def factorMarginal(): Factor 
} 

現在我有一個派生類如下:

case class SingleFactorNode(factor: SingleFactor, gate: FactorGate) extends FactorNode(factor) { 
    def factorMarginal(): Factor = { 
    val inMsg = gate.getEndGate().getMessage() 
    val factorMarginal = factor * inMsg 
    factorMarginal 
    } 
} 

幾個問題:1:在基類中的方法factorMarginal()。它似乎沒有身體,也沒有任何回報。這個怎麼用?它的方式完全是多餘的嗎?

2:第二個派生類中的factorMarginal()方法。那是否超過了基數因子方法。另外,這個方法的最後一行自稱(沒有任何括號),我很困惑這是什麼。它被稱爲基類因子Margin或實現某種遞歸?

+1

把Scala代碼翻譯成C++可能是個不錯的主意。你不能只用C++重新實現算法嗎?你提供的樣本看起來應該存在一篇描述這種算法的研究論文。 – ziggystar

回答

3

基類中的factorMarginal方法是抽象的。在C++中,你會使其純虛:

virtual Factor factorMarginal() = 0; 

是,在派生類中的方法factorMarginal覆蓋一個基類。在C++中,你可以按如下方式寫:

virtual Factor factorMarginal() override { 
    auto const inMsg = gate.getEndGate().getMessage(); 
    return factor * inMsg; 
} 

最後一行不調用方法本身,但它返回具有相同名稱的局部變量。

確保在C++中使用const方法(如果有意義的話)。

請注意,Scala的sealed沒有C++等價物。

+0

謝謝你的回答! – Luca

+0

我打算這樣做,但它讓我等10分鐘,因爲我是一個n00b! :) – Luca