2012-07-02 15 views
7

これは愚かな質問かもしれませんが、私は次の行でコードがあります。 奇妙なC++構文ですか?

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

が、私は三項演算子を知っているが、それは私に少し混乱等号のですが。誰か私に説明を教えてもらえますか?ありがとう。アウト書かれ

+18

これは、一度に2つの変数を割り当てる*非常に醜い*手段です。 *(火のような火付けコード[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に説明しているだけです。 – NominSim

2

三項演算子が値を返します。 UseDummySolverのブール値に基づいて、ダミーソルバを返します。または、新しいインスタンスSTPSolver()を返します。この戻り値はSTPSに格納されます。

5

あなたはチェーン割り当てを見ています。

それは同じです:

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

@sixlettervariablesはい、申し訳ありませんが、C + +私の義務を固定。 – NominSim

+0

タイミングはすべてです:) +1 too too – 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は、最初のケースでは、オブジェクトがスコープ内にある間にそのオブジェクトにアクセスするもう1つの方法ですが、後者の場合、オブジェクトの独立した「共同所有者」であり、両方のポインタを個別に再割り当てすることができます。