Dưới đây là hai đoạn (sẵn sàng biên dịch) mã. Trong đoạn đầu tiên, trong đó tôi chỉ sử dụng khai báo chuyển tiếp cho một cấu trúc trong khi xóa con trỏ đến cấu trúc này từ một trình băm lớp cơ sở cho một lớp Khách không được gọi.
Trong đoạn thứ hai khi thay vì khai báo về phía trước, tôi sử dụng định nghĩa đầy đủ của lớp Khách này bằng cách sử dụng xóa trong cơ sở hoạt động ase dự định.
Tại sao? Tại sao nó tạo nên sự khác biệt? Không phải là tuyên bố về phía trước giả sử là chỉ là một lưu ý cho một trình biên dịch nói rằng định nghĩa của lớp này/struct là ở một nơi khác?
Tôi rất ngạc nhiên vì nó không hoạt động một cách trực giác.Tuyên bố chuyển tiếp sẽ không thực hiện
//First just forward dclr
#include "stdafx.h"
#include <iostream>
using std::cout;
struct Guest;
struct Base
{
Guest* ptr_;
Base(Guest* ptr):ptr_(ptr)
{
cout << "Base\n";
}
~Base()
{
cout << "~Base\n";
delete ptr_;
}
};
struct Guest
{
Guest()
{
cout << "Guest\n";
throw std::exception();
}
Guest(int)
{
cout << "Guest(int)\n";
}
~Guest()
{
cout << "~Guest\n";
}
};
struct MyClass : Base
{
Guest g;
MyClass(Guest* g):Base(g)
{
cout << "MyClass\n";
}
~MyClass()
{
cout << "~MyClass\n";
}
};
int _tmain(int argc, _TCHAR* argv[])
{
try
{
Guest* g = new Guest(1);
MyClass mc(g);
}
catch(const std::exception& e)
{
std::cerr << e.what();
}
return 0;
}
// Thứ hai - đầy đủ def
#include "stdafx.h"
#include <iostream>
using std::cout;
struct Guest
{
Guest()
{
cout << "Guest\n";
throw std::exception();
}
Guest(int)
{
cout << "Guest(int)\n";
}
~Guest()
{
cout << "~Guest\n";
}
};
struct Base
{
Guest* ptr_;
Base(Guest* ptr):ptr_(ptr)
{
cout << "Base\n";
}
~Base()
{
cout << "~Base\n";
delete ptr_;
}
};
struct MyClass : Base
{
Guest g;
MyClass(Guest* g):Base(g)
{
cout << "MyClass\n";
}
~MyClass()
{
cout << "~MyClass\n";
}
};
int _tmain(int argc, _TCHAR* argv[])
{
try
{
Guest* g = new Guest(1);
MyClass mc(g);
}
catch(const std::exception& e)
{
std::cerr << e.what();
}
return 0;
}
Bạn nên tạo các trình tạo lớp cơ sở ảo trong cả hai trường hợp. –
@ Space_C0wb0y: Kính gửi, bạn không thể tạo một hàm tạo ảo trong C++ :) –
@Armen: Từ ngữ ... khói và gương. Nó rất rõ ràng trong đầu tôi. (Đối với những người tự hỏi, nó sẽ là * destructors *) –