2012-07-02 60 views
7

這可能是一個愚蠢的問題,但我有以下行代碼:奇怪的C++語法?

Solver *S, *STP = S = 
UseDummySolver ? createDummySolver() : new STPSolver(true); 

我知道三元運算符,但它是等於說讓我困惑了一下跡象。任何人都可以給我一些解釋嗎?謝謝。

+18

這是一個*非常醜陋*的手段,一次分配兩個變量。 *(用火燒這樣的代碼[rs])* – user7116

+3

這段代碼顯然很糟糕。雙重任務部分只是其中之一。不使用RAII是另一種。 –

+0

是的......我甚至沒有意識到這是合法的,我以前從未見過! – steveha

回答

16

寫出來,這是

Solver *S; 
Solver *STP; 
S = UseDummySolver ? createDummySolver() : new STPSolver(true); 
STP = S; 

這是非常醜陋的,雖然,我不建議這樣做,在你的代碼。

推薦的方法將如下所示(使用初始化,而不是分配)把它寫:

Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true); 
Solver *STP = S; 
+1

+1只要打我:) – NominSim

+2

爲什麼不使用初始化而不是賦值? – Nawaz

+0

@Nawaz他只是向OP解釋代碼實際上是什麼_does_。 – NominSim

2

三元運算符返回一個值;基於UseDummySolver布爾值,它將返回一個虛擬求解器或返回一個新實例STPSolver()。然後將該返回的值存儲在STPS中。

5

您正在查看鏈接作業。

這是一樣的:

Solver *S; 
Solver *STP; 
S = UseDummySolver ? createDummySolver() : new STPSolver(true); 
STP = S; 
+0

@sixlettervariables是啊修好了抱歉,C++不是我的特長。 – NominSim

+0

時間就是一切:) +1太 – houbysoft

+1

@sixlettervariables,NominSim,我編輯了答案,並把錯誤的解除引用。對於那個很抱歉;原代碼讓我困惑。根本不是NominSim的錯。 – steveha

6

我會推薦這:

Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true); 
Solver *STP = S; 

它簡潔,但乾淨整潔。

另外,它使用初始化,而不是賦值。只要有可能,您應該更喜歡初始化分配。

+1

給你一個+1初始化與分配的建議:) – houbysoft

0

我寧願要麼是:

std::unique_ptr<Solver> S ( UseDummySolver 
            ? createDummySolver() 
            : new STPSolver(true) ); 
Solver& STP = *S; 

或本:

std::shared_ptr<Solver> S ( UseDummySolver 
            ? createDummySolver() 
            : new STPSolver(true) ); 
std::shared_ptr<Solver> STP = S; 

兩個避免一個問題,你有沒有代碼:我們不需要做決定哪些指針在對象離開作用域時調用delete(或者實際上,請記住需要調用delete)。相反,我們只是等到變量離開範圍,然後Solver對象被自動刪除。 STP在第一種情況下明顯地是訪問該對象時的另一種方式,在第二種情況下,它是對象的獨立「共同所有者」,並且這兩個指針可以獨立地重新分配。