Hãy cân nhắc những điều sau đây:C chứa ++ STL và xây dựng tại chỗ
class CMyClass
{
public:
CMyClass()
{
printf("Constructor\n");
}
CMyClass(const CMyClass&)
{
printf("Copy constructor\n");
}
};
int main()
{
std::list<CMyClass> listMyClass;
listMyClass.resize(1);
return 0;
}
Nó tạo ra kết quả như sau:
Constructor
Sao chép constructor
Bây giờ tôi câu hỏi là: Làm cách nào để tránh trình tạo bản sao? Hoặc để đặt nó theo một cách khác: Làm thế nào tôi có thể tạo các đối tượng bên trong một container STL mà không cần thao tác sao chép không cần thiết. Có cách nào để làm một "tại chỗ" xây dựng bằng cách sử dụng constructor mặc định?
Update - câu trả lời cho đến nay:
- Nó không thể được thực hiện
- Sử dụng con trỏ hoặc gợi ý thông minh để thay thế.
Con trỏ thông minh là quá mức cần thiết cho ứng dụng của tôi. Nhưng tôi thực sự tự hỏi tại sao điều này không thể được thực hiện. Nó có vẻ như một điều rõ ràng như vậy muốn làm. Bất kỳ ý tưởng nào khác? Tôi thậm chí sẽ chấp nhận một hack khó chịu nếu nó hoạt động ...
Giải pháp
Tôi nghĩ rằng tôi chỉ tìm thấy một giải pháp cho vấn đề của tôi từ tất cả các ý kiến và câu trả lời được đặt ra ở đây. Giải pháp là xây dựng một đối tượng trống và giữ nó xung quanh với mục đích duy nhất là sử dụng nó sau này để tạo các bản sao sạch. Sau đó, bạn có thể sử dụng một trong các phương thức lấy tham chiếu (như push_back hoặc chèn). Đây vẫn gọi các nhà xây dựng bản sao cho mỗi đối tượng mới chèn, nhưng ít nhất nó không phải là tất cả các nhà xây dựng mặc định AND copy constructor:
int main()
{
CMyClass Empty;
std::list<CMyClass> listMyClass;
for (int c=0; c<10; ++c)
{
listMyClass.push_back(Empty);
}
return 0;
}
Nó có thể có vẻ một điều hiển nhiên, nhưng từ quan điểm chức năng, không quan trọng và một số thuật toán (sắp xếp, xóa, ...) cũng sử dụng sao chép, vì vậy hãy chuẩn bị để sao chép;) (Xem thêm http: //www.devx .com/tips/Tip/13606) – stefaanv
Một điều hiển nhiên phải làm? Tại sao vậy? Tại sao sao chép một vấn đề? – jalf
Rõ ràng? Nếu bạn gọi là 'mylist.resize (10)', làm thế nào bạn mong đợi để kết thúc với mười đối tượng riêng biệt nếu chúng không phải là bản sao? – visitor