これは愚かな質問かもしれませんが、私は次の行でコードがあります。 奇妙な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;
Solver *STP;
S = UseDummySolver ? createDummySolver() : new STPSolver(true);
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
は、最初のケースでは、オブジェクトがスコープ内にある間にそのオブジェクトにアクセスするもう1つの方法ですが、後者の場合、オブジェクトの独立した「共同所有者」であり、両方のポインタを個別に再割り当てすることができます。
これは、一度に2つの変数を割り当てる*非常に醜い*手段です。 *(火のような火付けコード[rs])* – user7116
このコードが明らかに吸う理由はたくさんあります。二重割り当て部分は、そのうちの一つです。 RAIIを使用しないことは別です。 –
はい...私はそれが合法であることに気付かず、前にそれを見たことがありません! – steveha