2012-03-11 38 views

Trả lời

8

Say:

const A a[3] = { {0,0}, {1,1}, {2,2} }; 

Mở trình biên dịch cũ, và giả sử A có một constructor sao chép truy cập, bạn có thể nói:

const A a[3] = { A(0,0), A(1,1), A(2,2) }; 

C++ sử dụng để được khá thiếu đối với mảng với (nhất định các khởi tạo không thể thực hiện được), và điều này đã tốt hơn một chút trong C++ 11.

+0

Trong trường hợp đầu tiên, trình biên dịch chỉ ra sự ấm lên: 'main.cpp: 10: 32 : warning: danh sách khởi tạo mở rộng chỉ có sẵn với -std = C++ 0x hoặc -std = gnu ++ 0x [được bật theo mặc định]. ' "Truy cập" có nghĩa là gì? một công cộng ?, và, cảm ơn bạn. –

+0

@UniMouS: Trên GCC, biên dịch với '-std = C++ 0x'. Có thể truy cập có nghĩa là bạn có thể truy cập nó, tức là nó không phải là riêng tư hoặc '= xóa'd. –

+0

cảm ơn bạn, @Kerrek: và ý nghĩa của '= delete' là gì? –

1

Chừng nào loại có constructior bản sao (cho dù là tổng hợp hoặc một cách rõ ràng định nghĩa) các công việc sau:

A array[] = { A(1, 3), A(3, 4), A(5, 6) }; 

Công việc này cả với C++ 2003 và C++ 2011. Các giải pháp đăng bởi KerrekSB chắc chắn không không làm việc với C++ 2003 nhưng có thể làm việc với C++ ++ (Tôi không chắc chắn nếu nó hoạt động ở đó).

+0

Trình tạo bản sao cũng cần phải truy cập được. Chỉ cần * có * một là không đủ. –

0

bạn có thể cung cấp hàm tạo mặc định và khởi tạo mảng của bạn như bình thường. Sau khi khởi tạo thành công, sử dụng một vòng lặp để chỉ định lại giá trị cho từng thành viên

0

tôi nghĩ rằng nó phải như thế này

const A a[3] = { A(1, 2), A(3, 4), A(5, 6) };

+0

mới sẽ làm cho bạn con trỏ-to-A, không A-trường hợp –

+0

vấn đề trình biên dịch một lỗi: main.cpp: 9: 42: lỗi: chuyển đổi từ 'A *' thành loại vô hướng 'A' yêu cầu –

+0

xin lỗi , câu trả lời đã sửa – hamed

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