2010-10-29 3 views
14

Có điều gì sai với công đoàn có một hoặc nhiều phương pháp không? Hoặc bất cứ điều gì để xem ra cho? (Tôi có thể thấy các nhà thầu/người phá hủy có vấn đề vì lý do tâm thần phân liệt)C++: công đoàn với phương pháp?

+0

Tôi không thấy bất cứ điều gì sai trái với họ ngoại trừ những gì bạn đã đề cập về các destructors và bộ nhớ giải phóng. – Jim

+1

Đây chính là lý do tại sao bạn không thể có các thành viên công đoàn của một loại lớp/cấu trúc có một nhà xây dựng không nhỏ, người hủy hoặc toán tử gán. –

Trả lời

20

Từ (Dự thảo N3092) tiêu chuẩn C++ 03 & C++ 0x:

9,5 Đoàn
Một đoàn có thể có chức năng thành viên (bao gồm cả constructor và destructor), nhưng không chức năng ảo (10.3). Công đoàn sẽ không có các lớp cơ sở. Công đoàn không được sử dụng làm lớp cơ sở.

Khởi tạo liên minh bằng cú pháp khởi tạo tổng hợp (U u = { 42 };) hoặc đặt thành viên sau đó (U u; u.i = 42;) không phải là "có vấn đề". Và không phải là khởi tạo nó bằng cách sử dụng một hàm tạo (U u(42);).
Chỉ "bắt" là bạn không thể sử dụng cú pháp khởi tạo tổng hợp cho một liên minh có một hàm tạo do người dùng xác định.

+0

là mới này cho C++ 0x, hoặc nó đã là một phần của tiêu chuẩn C++? –

+0

@Jim: Phần đó không thay đổi. –

+0

công đoàn có thể có các nhà thầu? thì khi nào/không phải là xây dựng một vấn đề? –

-7

Làm cách nào để bạn có thể thực hiện một điều như vậy? Dưới đây là một con trỏ đến một liên minh, hy vọng bạn không nhớ rằng bạn không có ý tưởng mà các biến được an toàn để sử dụng và không.

Các công đoàn là một tính năng ngôn ngữ chết thực sự - chúng đã được thay thế hoàn toàn bằng các phương pháp dựa trên thư viện như tăng :: biến thể hoặc tăng :: bất kỳ. Loại tương tự như void * và macro chức năng - chúng rất hiếm khi hữu ích trong C++ so với các tùy chọn khác.

+2

Đừng quên thế giới được nhúng. Đôi khi mọi thứ không an toàn 100%. –

+0

@ Jason: Làm thế nào để được nhúng thay đổi bất cứ điều gì? Hoặc bạn biết loại đó là gì, vì vậy hãy sử dụng biến thông thường, bạn biết tất cả các loại có liên quan, vì vậy hãy sử dụng đa hình hoặc bạn cần biết loại đó là gì trước khi bạn có thể làm bất kỳ điều gì. – Puppy

+5

Nhúng không thay đổi bất cứ điều gì về ngôn ngữ cho mỗi se, nhưng nó đặt giới hạn về phân bổ bộ nhớ động và đa hình (và nhiều thúc đẩy là ra) mà thiên vị bạn hướng tới các kỹ thuật khác. Thông thường nhất là một liên minh giữa hai bit 16 bit và một bit 32 bit hoặc một liên kết giữa một số 16 hoặc 32 bit và một cấu trúc với các bitfield. Trong những trường hợp đó, cả hai thành viên của công đoàn đều có nội dung hợp lệ như nhau; đó là cả hai loại. –