Đầu tiên thêm đối tượng không phải là con trỏ, còn đối tượng thứ hai thêm con trỏ vào vectơ. Vì vậy, tất cả phụ thuộc vào việc khai báo của vectơ mà bạn nên làm.
Trong trường hợp của bạn, vì bạn đã tuyên bố objects
như std::vector<DrawObject>
, vì vậy một trong những đầu tiên sẽ làm việc, như objects
có thể lưu trữ các mặt hàng loại DrawObject
, không DrawObject*
.
Trong C++ 11, bạn có thể sử dụng emplace_back
như:
objects.emplace_back(name, surfaceFile, xPos, yPos,
willMoveVar, animationNumber);
Lưu ý sự khác biệt. Hãy so sánh nó với:
objects.push_back(DrawObject(name, surfaceFile, xPos, yPos,
willMoveVar, animationNumber));
Với emplace_back
, bạn không xây dựng các đối tượng tại các cuộc gọi tại chỗ, thay vào đó bạn vượt qua các đối số vector, và vector trong nội bộ xây dựng các đối tượng tại chỗ. Trong một số trường hợp, điều này có thể nhanh hơn.
Đọc doc về emplace_back mà nói (nhấn mạnh của tôi),
Gắn một yếu tố mới để kết thúc container. Phần tử được tạo tại chỗ, tức là không có thao tác sao chép hoặc di chuyển nào được thực hiện. Hàm khởi tạo của phần tử được gọi với chính xác cùng một đối số được cung cấp cho hàm.
Vì nó tránh bản sao hoặc di chuyển, mã kết quả có thể là nhanh hơn một chút.
Một người sẽ biên dịch, người kia sẽ không. – chris
Ngoài ra, với thiết lập đó, một là nhiều Java/C# và một là C++. – chris
Tôi không thấy bất kỳ cách nào mà cả hai người trong số họ sẽ biên dịch ... Có phải 'DrawObject' chỉ là một _class_? Có _convertible _/_ constructible_ từ con trỏ không? –