這可能是一個愚蠢的問題,但我有以下行代碼:奇怪的C++語法?
Solver *S, *STP = S =
UseDummySolver ? createDummySolver() : new STPSolver(true);
我知道三元運算符,但它是等於說讓我困惑了一下跡象。任何人都可以給我一些解釋嗎?謝謝。
這可能是一個愚蠢的問題,但我有以下行代碼:奇怪的C++語法?
Solver *S, *STP = S =
UseDummySolver ? createDummySolver() : new STPSolver(true);
我知道三元運算符,但它是等於說讓我困惑了一下跡象。任何人都可以給我一些解釋嗎?謝謝。
寫出來,這是
Solver *S;
Solver *STP;
S = UseDummySolver ? createDummySolver() : new STPSolver(true);
STP = S;
這是非常醜陋的,雖然,我不建議這樣做,在你的代碼。
推薦的方法將如下所示(使用初始化,而不是分配)把它寫:
Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true);
Solver *STP = S;
三元運算符返回一個值;基於UseDummySolver
布爾值,它將返回一個虛擬求解器或返回一個新實例STPSolver()
。然後將該返回的值存儲在STP
和S
中。
我會推薦這:
Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true);
Solver *STP = S;
它簡潔,但乾淨整潔。
另外,它使用初始化,而不是賦值。只要有可能,您應該更喜歡初始化分配。
給你一個+1初始化與分配的建議:) – houbysoft
我寧願要麼是:
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
在第一種情況下明顯地是訪問該對象時的另一種方式,在第二種情況下,它是對象的獨立「共同所有者」,並且這兩個指針可以獨立地重新分配。
這是一個*非常醜陋*的手段,一次分配兩個變量。 *(用火燒這樣的代碼[rs])* – user7116
這段代碼顯然很糟糕。雙重任務部分只是其中之一。不使用RAII是另一種。 –
是的......我甚至沒有意識到這是合法的,我以前從未見過! – steveha