Tôi lo lắng về việc sử dụng loại không đầy đủ với con trỏ thông minh và cách con trỏ bị xóa. Mã sau có an toàn không? Tôi không nghĩ rằng nó sẽ được, như main.cpp sẽ tạo ra destructor mặc định của Farm mà sẽ không nhìn thấy loại hoàn chỉnh. Để làm cho nó an toàn, tôi nghĩ rằng tôi nên tạo một destructor phi nội tuyến mà nhìn thấy loại hoàn chỉnh. Đúng không?Làm cách nào để hủy lớp an toàn bằng con trỏ thông minh thành loại đối tượng không đầy đủ?
Cũng vậy, nếu tôi sử dụng std::vector<Cow>
trong trang trại thay thế?
farm.h
class Cow;
struct Farm
{
Farm();
// ~Farm();
std::unique_ptr<Cow> cow;
};
farm.cpp
#include "cow.h"
// cow now complete
Farm::Farm()
{
cow.reset(new Cow);
}
// Farm::~Farm() {}
main.cpp
#include "farm.h"
int main()
{
Farm farm;
}
Edit: Tôi cố gắng để biên dịch với Visual Studio mà không destructor và nó nói lỗi C2338: không thể xóa loại không đầy đủ. Tôi đoán rằng câu trả lời cho câu hỏi của tôi.
Lưu ý rằng với auto_ptr, mã biên dịch: -/ – Jarod42
@Jarod: Có, và âm thầm làm điều sai. –
http://stackoverflow.com/questions/8595471/does-the-gotw-101-solution-actually-solve-anything –