2013-08-08 34 views
5

Tôi đã thấy mã như thế này, vì vậy tôi đang cố gắng tìm ra lý do.
Lý do chính để có các hàm tĩnh hoạt động như các hàm tạo, thay vì có các hàm tạo thực tế là gì?Lợi ích của các chức năng tĩnh cho các công trình lớp học

Ý tôi là cái gì đó như:

class MyClass 
{ 
    public: 
    static MyClass CreateFrom(bar); 
    static MyClass CreateFrom(foo); 
    ... 
} 

thay vì:

class MyClass 
{ 
    public: 
    MyClass(bar); 
    MyClass(foo); 
    ... 
} 

Trả lời

10

Đây được gọi là "thành ngữ hàm tạo tên".

Nó thường được sử dụng khi:

  1. Bạn có rất nhiều ctors với danh sách tham số đủ đủ tương tự mà quá tải ctors sẽ gây nhầm lẫn (ví dụ, các hỗn hợp khác nhau của số nguyên và số dấu phẩy động, do đó, 1, 1.0, 1 được cho là có ý nghĩa khác với 1, 1, 1.0).
  2. Bạn có hai nguồn khác nhau mà cả hai đều cung cấp đầu vào giống như loại. Ví dụ, chúng ta hãy giả sử bạn muốn chuyển đổi một khoảng cách trên bề mặt trái đất vào góc subtended giữa các điểm khoảng cách xa nhau - nhưng bạn có thể muốn cung cấp các khoảng cách trong dặm hoặc km, một trong hai trong số đó sẽ được thể hiện dưới dạng một double.

Trong trường hợp này một đơn angle(double dist) không thể phân biệt giữa đầu vào trong kilomet vs dặm, nhưng: angle_from_milesangle_from_kilomters thể làm điều đó khá dễ dàng.

+0

Ví dụ cụ thể, tôi đã sử dụng nó trong một lớp 'Thời lượng':' Thời lượng :: Ngày', 'Thời lượng :: Giờ',' Thời lượng :: Phút '... tất cả lấy cùng một đối số và làm cho nó rõ ràng những gì đơn vị của nó nên được khi nhận được. –

+0

Cũng hữu ích khi sử dụng 'enable_shared_from_this'. http://mortoray.com/2013/08/02/safely-using-enable_shared_from_this/ –

7

Họ được gọi là Named Constructors.

Về cơ bản, được sử dụng khi bạn muốn xây dựng một đối tượng yêu cầu phải truyền một bộ thông số cụ thể nhưng nội bộ bạn cần phải xây dựng đối tượng khác nhau.

Ví dụ, bạn có một lớp học như:

class AREA 
{ 
double area; 
AREA(int x); 
}; 

//how will you construct the object differently in case of circle and square?? 

Đối với mục đích này, chúng tôi đã đặt tên constructors giúp để tạo ra một đối tượng có liên quan.

Vì vậy, chúng tôi có thể tạo ra 2 phương pháp tĩnh bên trong lớp như:

static AREA square(int x) 
{ return AREA(x*x); } 

static AREA circle(int x) 
{ return AREA(x*x*3.14); } //or a more accurate PI value 

Như vậy, chúng ta có thể gọi hàm tĩnh liên quan đến trả lại đối tượng khởi tạo với các khu vực cần thiết.

LƯU Ý: Đây là tĩnh như khi tạo đối tượng cho một lớp cụ thể bạn không nên yêu cầu đối tượng làm như vậy.

Kiểm tra THIS để biết thêm chi tiết.

1

Lợi ích rõ ràng nhất là:

  • Thật dễ dàng để xác định việc thực hiện đó xây dựng các ví dụ tại callsite, khi nhiều nhà xây dựng được cung cấp. Điều này giúp lớp học cung cấp nhiều biến thể dễ dàng hơn.
  • Các biến thể này cũng có thể có các tên khác nhau, nhưng danh sách tham số giống nhau (hoặc danh sách tham số mà trình biên dịch có thể gọi là mơ hồ khi xác định chọn nào).
  • Nó giúp bạn bởi vì bạn có thể đọc những gì nhà xây dựng của bạn thực hiện cuộc gọi - tại callite.

Một lý do khác là dễ dàng hơn trong một số trường hợp khởi tạo lớp trong cơ thể hàm, thay vì sử dụng danh sách khởi tạo.

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