2011-09-05 40 views
6

Có thể và tại sao người ta muốn làm điều đó?static_cast cho các loại do người dùng xác định

Thông thường static_cast được sử dụng với kiểu số và con trỏ, nhưng nó có thể hoạt động với kiểu dữ liệu do người dùng định nghĩa, lớp a.k.a không?

+0

Có, nó có thể hoạt động, nhưng bạn cũng phải biết cách sử dụng nó - đây là một khởi đầu về những gì mỗi diễn viên nào trong C++: http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be-used – birryree

Trả lời

10
Bar bar = static_cast<Bar>(foo); 

Thao tác này sẽ không thành công. FooBar nhiều loại không tương thích, trừ khi ít nhất một trong những điều sau đây là đúng:

  • Foo có nguồn gốc từ Bar, Hoặc
  • Bar có một constructor mà mất Foo, Hoặc
  • Foo có một người dùng định nghĩa chuyển đổi thành Bar.

Câu hỏi lớn hơn ở đây không phải là liệu nó có thành công hay không. Câu hỏi lớn hơn và thực tế phải là: bạn muốn rời khỏi diễn viên như thế nào? Tại sao bạn muốn làm một điều như vậy ở nơi đầu tiên? Nó phải làm gì? Ý tôi là, đối tượng Bar sẽ được khởi tạo từ đối tượng Foo như thế nào?

Cách hợp lý để chuyển đổi một loại khác là một trong những cách sau:

Hoặc xác định Foo như:

class Foo : public Bar 
{ 
    //... 
}; 

Hoặc xác định Bar như:

class Bar 
{ 
    public: 
     Bar(const Foo &foo); //define this constructor in Bar! 
}; 

Hoặc cung cấp hàm chuyển đổi trong Foo là:

class Foo 
{ 
    public: 
     operator Bar(); //provide a conversion function Foo to Bar! 
}; 
+1

Hoặc nó sẽ thất bại? Điều gì xảy ra nếu 'Foo' thực hiện toán tử chuyển đổi thành' Bar'? –

+0

@Kerrek: Tôi đã cập nhật câu trả lời của mình với các chi tiết như vậy. – Nawaz

+1

Điều đó đảm bảo +1 –

11

Dưới đây là các quy tắc:

Khái niệm static_cast<T>(e) có giá trị khi và chỉ khi định nghĩa biến sau đây là hợp lệ

T x(e); 

nơi x là một số biến phát minh.

Vì vậy, nói chung, hai loại không liên quan không thể được đúc với nhau. Tuy nhiên, nếu một loại có nguồn gốc từ một loại khác, hoặc khi một định nghĩa một hàm chuyển đổi sang một hàm khác hoặc có một hàm tạo lấy một đối số duy nhất của kiểu khác - trong các trường hợp này static_cast sẽ được xác định rõ.

Tính năng này có hợp lý không? Ví dụ, nếu T định nghĩa một hàm tạo lấy một U duy nhất và hàm khởi tạo là explicit thì static_cast<T>(e) trong đó e là kiểu U sẽ có ý nghĩa hoàn hảo

+1

Điều này đặc biệt có ý nghĩa trong mã chung, ví dụ nếu T có thể là loại do người dùng xác định nhưng cũng có thể là loại được tích hợp sẵn. Sau đó, nếu bạn đã viết '(T (e))' thay vì 'static_cast (e)' (thêm parens để đảm bảo nó không phải là định nghĩa 'e'), thì đó là một kiểu C-cast tương đương với' ((T) e) ', và đối với các kiểu tích hợp, có nguy cơ biến nó thành' reinterpret_cast'. –

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