2012-02-16 40 views
19

Tôi không muốn hỏi một câu hỏi chủ quan chủ quan ở đây, nhưng tôi không có ai khác để hỏi trực tiếp điều này ...C++: Sử dụng tự động hoặc typedef?

Tôi đang cố gắng "dẫn đầu bằng ví dụ" trong nhóm của mình bằng cách áp dụng thêm các khái niệm C++ hiện đại trong mã mới tôi viết. Đồng nghiệp của tôi hơi nhút nhát các mẫu và không cần phải nhập unique_ptr<Foobar> hoặc shared_ptr<Foobar> thay vì chỉ Foobar* khi sử dụng một số lớp tôi vừa tạo (phương thức factory trả về unique_ptr s và tôi lưu trữ danh sách các đối tượng này trong vectơ sử dụng shared_ptr).

Họ vặn cánh tay của tôi và thuyết phục tôi đánh máy vào những thứ dễ dàng hơn để nhập, ví dụ: FoobarUniquePtr.

Nhưng bây giờ tôi đang ở trong một mớ hỗn độn của const-đúng đắn với những typedefs. Tôi sẽ phải xác định typedefs thêm cho mỗi const và loại const thuốc, và const const_FoobarUniquePtr dường như không thể hiện đúng ngữ nghĩa const. Vì vậy, với câu hỏi của tôi, nó sẽ có ý nghĩa để ngừng sử dụng các typedefs và thay vì xô auto tại đồng đội của tôi khi họ phàn nàn về việc phải gõ con trỏ thông minh templated? Tôi cũng mở cửa cho các lựa chọn thay thế khác.

+8

+1 vì cố gắng để đồng nghiệp của bạn sử dụng nhiều thực tiễn hiện đại hơn! – Nick

+0

Vì vậy, vấn đề với 'unique_ptr ' hoặc 'const unique_ptr '? – Useless

+0

âm thanh như tự động được tạo ra chỉ dành cho loại điều này. một phím tắt đẹp cho phép bạn chỉ cần đặt tự động thay vì tìm ra chính xác loại mà bạn cần sử dụng cho biến. khi bạn hỏi liệu nó có ý nghĩa hay không, tốt, một phần của tiêu chuẩn ngôn ngữ và sử dụng nó theo cách này nghe có vẻ 'đúng' với tôi. Nhưng tất nhiên một số sở thích cá nhân có thể đi vào nó như tôi tưởng tượng một số có thể tranh luận rằng họ thà nhìn thấy loại rõ ràng bất cứ nơi nào nó được sử dụng và không dựa vào tự động. Nhưng ngoài sở thích cá nhân, nó có vẻ giống như một cách sử dụng hợp lệ. – Nerdtron

Trả lời

15

Nói chung, tự động giúp cuộc sống của bạn dễ dàng hơn nhiều.

Nếu bạn không vận chuyển trên bất kỳ kiến ​​trúc bí truyền (và không có kế hoạch để làm như vậy bất cứ lúc nào sớm), câu trả lời sẽ là "sử dụng tự động bất cứ khi nào bạn có thể".

+0

Đây không phải luôn luôn là lời khuyên tốt (Mặc dù cũng áp dụng cho nhận xét này). Đôi khi ý định lập trình viên có thể bị ẩn hoặc trong một số ít trường hợp có thể xảy ra sự cố bất ngờ và khó theo dõi nếu bạn đang sử dụng trình biên dịch lỗi-trình biên dịch-lỗi-tin nhắn như GCC hoặc MSVC. – rubenvb

+0

@rubenvb Tôi đồng ý. Herb Sutter gần đây đã tuyên bố trong bài phát biểu của mình tại GoingNative 2012 rằng chúng ta nên luôn sử dụng 'auto' trừ khi chúng ta muốn thực hiện chuyển đổi kiểu. Tôi hy vọng anh ta đang cố tình giật mình. Bây giờ, tôi chỉ sử dụng tự động cho những thứ như vòng lặp STL, nơi mà không ai thực sự quan tâm đến loại đó và mọi người đều biết nó sẽ là gì. Nếu tên phương thức tự truyền tải hành vi/ý định của loại (đặc biệt nếu kiểu trả về là một phần của tham số mẫu), tôi có thể sống với một người dùng 'auto', nhưng tôi sẽ không mặc định nó. –

8

Tôi đoán bạn cần phải xác định tất cả các biến bạn có thể cần.

Nhận chàng trai của bạn để xem presentaion từ Bjarne Stoustrup và đọc một số blog trong C++ 11. Đối với các mẫu mua một số sách trong danh sách sách và "trùng hợp", hãy thả một số sách trên bàn của bạn để bắt đầu thảo luận.

Bạn thậm chí có thể viết một vài presentions powerpoint, và trình bày chúng cho các thành viên nhóm của bạn và xây dựng một nền văn hóa nghiên cứu.

Bjarne Stroustrup: C++11 Style

danh sách sách: https://stackoverflow.com/tags/c%2b%2b/info

+1

Cảm ơn lời khuyên. Thật trùng hợp, tôi đã làm tất cả điều này. Tôi vừa xem xong tất cả các bài phát biểu từ GoingNative 2012, cũng như "C++ và Beyond", và một vài bài khác tôi có thể tìm thấy trực tuyến. Gần đây tôi đã mua "Thiết kế C++ hiện đại", nhưng mã mẫu đó có lẽ sẽ không giành được đồng nghiệp của tôi, ít nhất là cho đến khi tôi viết một số bản thân và đồng nghiệp của tôi bắt kịp tính linh hoạt. Tôi cũng đã thực hiện các bài thuyết trình của riêng mình về tính chính xác, ngữ nghĩa quyền sở hữu (và di chuyển ngữ nghĩa), Lambdas, và sau đó trình bày các tính năng của C++ 11. –

4

tôi phải xác định typedefs thêm cho mỗi const và không const loại

... mà sẽ gây ra một Blowup tổ hợp như số lượng các địa điểm trong đó const phù hợp với loại tăng. Giải thích cho đồng nghiệp của bạn rằng số lượng công việc bạn đang làm tăng theo cấp số nhân bởi vì họ đang chiến đấu với ngôn ngữ thay vì sử dụng nó. Và có, sử dụng auto khi thích hợp.

1

Khi tôi tạo ra một lớp mới một trong những điều đầu tiên tôi làm là:

class MyClass 
{ 
public: // Typedefs 
    typedef std::shared_ptr<MyClass> Ptr; 
    typedef std::shared_ptr<const MyClass> ConstPtr; 
}; 

Sau đó, người dùng của lớp học của tôi có thể sử dụng nó như:

MyClass::Ptr pMyClass = std::make_shared<MyClass>(); 

Lý do tôi thêm chúng vào lớp như typedefs công cộng là tôi ghét gây ô nhiễm không gian tên toàn cầu.

+2

Tôi đã xem xét cách tiếp cận đó.Vấn đề duy nhất của tôi với 'MyClass :: ConstPtr' là tôi sẽ đọc nó như thể' ptr' là 'const', không phải là đối tượng' MyClass'. Tôi không thể đưa ra một quy ước đặt tên để truyền đạt đúng những gì ngôn ngữ dễ dàng cung cấp, vì vậy tôi đang hướng tới việc tránh các typedef và chỉ sử dụng ngôn ngữ. –

Các vấn đề liên quan