2012-07-02 29 views
7

Đây có thể là một câu hỏi ngu ngốc nhưng tôi có một mã số với dòng sau:Cú pháp kỳ lạ C++?

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

Tôi biết các nhà điều hành ternary nhưng đó là tương đương với dấu hiệu cho thấy nhầm lẫn cho tôi một chút. Bất cứ ai có thể cho tôi một số lời giải thích? Cảm ơn.

+18

Đó là một * rất xấu xí * có nghĩa là chỉ định hai biến cùng một lúc. * (Ghi mã [rs] như thế này với lửa) * – user7116

+3

Có nhiều lý do mà mã này rõ ràng là hút. Phần chuyển nhượng kép chỉ là một trong số đó. Không sử dụng RAII là khác. –

+0

Vâng ... Tôi thậm chí còn không nhận ra điều đó là hợp pháp, và tôi chưa từng thấy điều đó trước đây! – steveha

Trả lời

16

viết ra, nó là

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

Nó rất xấu xí, mặc dù tôi không muốn khuyên bạn nên làm điều đó trong mã của bạn.

Cách đề nghị sẽ được viết như sau (sử dụng khởi tạo, chứ không phải là nhiệm vụ):

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

+1 Chỉ cần đánh tôi :) – NominSim

+2

Tại sao không sử dụng khởi tạo, thay vì chỉ định? – Nawaz

+0

@Nawaz Ông chỉ giải thích cho OP những gì mã thực sự _does_. – NominSim

2

Nhà điều hành ternary trả về giá trị; dựa trên giá trị Boolean UseDummySolver, nó trả về một trình giải giả giả hoặc nó trả về một thể hiện mới là STPSolver(). Giá trị trả lại này sau đó được lưu trữ trong STPS.

5

Bạn đang xem bài tập bị xích.

Nó cũng giống như:

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

@sixlettervariables Yeah cố định xin lỗi, C++ không phải sở trường của tôi. – NominSim

+0

Thời gian là tất cả mọi thứ :) +1 quá – houbysoft

+1

@sixlettervariables, NominSim, tôi đã chỉnh sửa câu trả lời và đưa vào dereference nhầm lẫn. Xin lỗi vì điều đó; mã ban đầu làm tôi bối rối. Không phải lỗi của NominSim. – steveha

6

Tôi muốn giới thiệu này:

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

Đó là ngắn gọn, nhưng gọn gàng và sạch sẽ.

Ngoài ra, nó sử dụng khởi tạo, thay vì gán. Bạn nên khởi tạo quá trình chuyển nhượng bất cứ khi nào có thể.

+1

Đã gửi cho bạn +1 cho đề xuất khởi tạo và chuyển nhượng :) – houbysoft

0

Tôi muốn một trong hai điều này:

std::unique_ptr<Solver> S ( UseDummySolver 
            ? createDummySolver() 
            : new STPSolver(true) ); 
Solver& STP = *S; 

hay này:

std::shared_ptr<Solver> S ( UseDummySolver 
            ? createDummySolver() 
            : new STPSolver(true) ); 
std::shared_ptr<Solver> STP = S; 

Cả tránh một vấn đề với mã bạn đã có ở đó: chúng ta không cần phải làm quyết định con trỏ đến hãy gọi delete khi các đối tượng rời khỏi phạm vi (hoặc, trên thực tế, hãy nhớ rằng cần phải gọi số delete). Thay vào đó, chúng tôi chỉ đợi cho đến khi các biến rời khỏi phạm vi, khi đó đối tượng Solver sẽ tự động bị xóa. STP là trường hợp đầu tiên umambiguously chỉ là một cách khác để truy cập các đối tượng trong khi nó trong phạm vi, trong trường hợp thứ hai nó là một "đồng sở hữu" độc lập của đối tượng và cả hai con trỏ độc lập có thể được giao lại.