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(). 然后将返回的值存储在STPand中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;

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

于 2012-07-02T22:19:22.533 回答