これはばかげた質問かもしれませんが、次の行のコードがあります。
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;
私はこれをお勧めします:
Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true);
Solver *STP = S;
簡潔でありながら、きちんとしていて清潔です。
また、割り当てではなく初期化を使用します。可能な限り、割り当てよりも初期化を優先する必要があります。
あなたは連鎖代入を見ています。
以下と同じです。
Solver *S;
Solver *STP;
S = UseDummySolver ? createDummySolver() : new STPSolver(true);
STP = S;
三項演算子は値を返します。ブール値に基づいてUseDummySolver
、ダミー ソルバーを返すか、 の新しいインスタンスを返しますSTPSolver()
。この戻り値は、 および に格納されSTP
ますS
。
私はこれを好むだろう:
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;
どちらも、そこにあるコードで 1 つの問題を回避します。オブジェクトがスコープを離れるときに呼び出すポインターを決定する必要はありませんdelete
(または、実際には、呼び出す必要があることdelete
をまったく覚えていません)。代わりに、変数がスコープを離れるまで待つだけで、Solver
オブジェクトは自動的に削除されます。STP
最初のケースでは、オブジェクトがスコープ内にある間にオブジェクトにアクセスするもう 1 つの方法であることは明らかです。2 番目のケースでは、オブジェクトの独立した「共同所有者」であり、両方のポインターを独立して再割り当てできます。