7

これはばかげた質問かもしれませんが、次の行のコードがあります。

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

三項演算子は知っていますが、少し混乱するのは等号です。誰か説明してもらえますか?ありがとう。

4

5 に答える 5

16

書き出すと、

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

非常に醜いですが、コードでそれを行うことはお勧めしません。

推奨される方法は、次のように記述することです (代入ではなく初期化を使用します)。

Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true);
Solver *STP = S;
于 2012-07-02T20:18:34.447 に答える
6

私はこれをお勧めします:

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

簡潔でありながら、きちんとしていて清潔です。

また、割り当てではなく初期化を使用します。可能な限り、割り当てよりも初期化を優先する必要があります。

于 2012-07-02T20:22:58.263 に答える
5

あなたは連鎖代入を見ています。

以下と同じです。

Solver *S;
Solver *STP;
S = UseDummySolver ? createDummySolver() : new STPSolver(true);
STP = S;
于 2012-07-02T20:19:47.120 に答える
2

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

于 2012-07-02T20:18:59.590 に答える
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;

どちらも、そこにあるコードで 1 つの問題を回避します。オブジェクトがスコープを離れるときに呼び出すポインターを決定する必要はありませんdelete(または、実際には、呼び出す必要があることdeleteをまったく覚えていません)。代わりに、変数がスコープを離れるまで待つだけで、Solverオブジェクトは自動的に削除されます。STP最初のケースでは、オブジェクトがスコープ内にある間にオブジェクトにアクセスするもう 1 つの方法であることは明らかです。2 番目のケースでは、オブジェクトの独立した「共同所有者」であり、両方のポインターを独立して再割り当てできます。

于 2012-07-02T22:19:22.533 に答える