这可能是一个愚蠢的问题,但我有一个包含以下行的代码:
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
and中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;
两者都避免了您获得的代码的一个问题:当对象离开范围时,我们不需要决定调用哪个指针delete
(或者,实际上,delete
根本不需要调用)。相反,我们只是等到变量离开作用域,然后Solver
对象被自动删除。STP
在第一种情况下,它只是在范围内访问对象的另一种方式,在第二种情况下,它是对象的独立“共同所有者”,并且两个指针都可以独立地重新分配。