这可能是一个愚蠢的问题,但我有一行代码如下:
Solver *S, *STP = S =
UseDummySolver ? createDummySolver() : new STPSolver(true);
我知道三元运算符,但它等于让我感到困惑的等号。谁能给我一些解释?感谢。
答案 0 :(得分:16)
写出来,是
Solver *S;
Solver *STP;
S = UseDummySolver ? createDummySolver() : new STPSolver(true);
STP = S;
虽然这很丑陋,但我不建议你在代码中这样做。
推荐的方法是按如下方式编写它(使用初始化,而不是赋值):
Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true);
Solver *STP = S;
答案 1 :(得分:6)
我建议这样做:
Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true);
Solver *STP = S;
它简洁,整洁,干净。
此外,它使用初始化,而不是赋值。您应该尽可能优先进行初始化而不是分配。
答案 2 :(得分:5)
你正在看链式作业。
与以下内容相同:
Solver *S;
Solver *STP;
S = UseDummySolver ? createDummySolver() : new STPSolver(true);
STP = S;
答案 3 :(得分:2)
三元运算符返回一个值;基于UseDummySolver
布尔值,它返回虚拟解算器或返回STPSolver()
的新实例。然后将此返回值存储在STP
和S
。
答案 4 :(得分: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
的指针(或者,实际上,记住需要调用{完全{1}}。相反,我们只是等到变量离开范围,然后自动删除delete
对象。 Solver
在第一种情况下只是另一种访问对象的方式,当它在范围内时,在第二种情况下,它是对象的独立“共同所有者”,并且两个指针都可以独立地重新分配。