2009-08-19 42 views
7

Vì vậy, tôi có một lớp trừu tượng Panel và triển khai thực hiện MyPanel. Họ trông giống như thế này:Chưa được giải quyết bên ngoài (bộ tạo lớp/trình phá hủy lớp trừu tượng)

class Panel : public QWidget 
{ 
public: 
    Panel(QWidget* parent = 0) = 0; 
    virtual ~Panel() = 0; 
    // but wait, there's more!! 
}; 

class MyPanel : public Panel 
{ 
public: 
    MyPanel(QWidget* parent = 0); 
    ~MyPanel() {}; // nothing to do here 
}; 

MyPanel::MyPanel(QWidget* parent) : 
    Panel(parent) 
{ 
    // you must construct additional pylons 
} 

Tôi nhận được mối liên kết lỗi cho các nhà xây dựng/destructor từ VC++

error LNK2019: unresolved external symbol "public: virtual __thiscall Panel::~Panel(void)" ([email protected]@[email protected]) referenced in function "public: virtual __thiscall MyPanel::~MyPanel(void)" ([email protected]@[email protected]) mypanel.obj 
error LNK2019: unresolved external symbol "public: __thiscall Panel::Panel(class QWidget *)" ([email protected]@[email protected]@@@Z) referenced in function "public: __thiscall MyPanel::MyPanel(class QWidget *)" ([email protected]@[email protected]@@@Z) mypanel.obj 

Tại sao tôi nhận được lỗi mối liên kết này?


--- CÂU TRẢ LỜI ---

class Panel : public QWidget 
{ 
public: 
    Panel(QWidget* parent = 0) : QWidget(parent) {}; 
    virtual ~Panel() {}; 
    // but wait, there's more!! 
}; 

tôi nghĩ rằng tôi đã cố gắng này trước khi ăn trưa. Hóa ra tôi đã sai.

+0

Dường như bạn có một số lỗi chính tả. Bạn có thể làm rõ? Tuyên bố lớp học cần phải kết thúc bằng a; ví dụ: lớp XXX {}; Ngoài ra bạn có những gì trông giống như một nhà xây dựng ảo nhưng điều đó không hợp lệ trong C++ – maccullt

+0

Sửa lỗi chính tả của tôi và thêm giải pháp đúng. –

+0

Trong "câu trả lời" của bạn, bạn nên chỉ ra một cách rõ ràng những gì bạn đã thay đổi (về cơ bản cung cấp các triển khai trống qua {}). Nếu không, nó còn lại như một bài tập để người đọc so sánh các mẫu mã của bạn và hiểu những gì khác nhau. – User

Trả lời

6
  1. không có thứ gì giống như hàm tạo ảo.
  2. Bạn vẫn nên cung cấp triển khai trình phá hủy.
3

Trình phá hủy hoàn toàn ảo vẫn cần phải triển khai.

Để mở rộng trên đó một chút:

Destructor của một lớp sẽ luôn luôn được gọi là nếu bất kỳ trường hợp của một lớp con được destructed, vì vậy nó cần phải có một thực hiện. (Về cơ bản, hiệu ứng duy nhất của việc tạo ra một destructor hoàn toàn là ảo là nó ngăn cản sự instanatiation của lớp).

Đối với hàm tạo: Bạn đang làm cho nó hoàn toàn là ảo (mà tôi không thấy bất kỳ lý do nào để làm), nhưng sau đó bạn gọi nó một cách rõ ràng từ hàm tạo của lớp con.

+2

Constructors không thể ảo trong C++. – maccullt

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