2012-03-09 33 views
5

Tôi cố gắng để viết một proxy Http rằng về cơ bản hoạt động như indianwebproxytài liệu tham khảo không xác định để vtable cho ...

Vì vậy, tôi bị sa thải lên QtCreator và nhưng một trong các lớp học của tôi là thất bại trong việc biên dịch với lỗi khét tiếng: undefined reference to vtable for HttpProxyThreadBrowser. Tôi không thể hiểu tại sao nó làm điều này. Tôi đọc qua các câu hỏi tương tự trên Stackoverflow và rõ ràng là the problem is with undefined virtual methods that are not pure Nhưng tôi đã không khai báo bất kỳ chức năng ảo nào. Đây là lớp của tôi

class HttpProxyThreadBrowser : public QThread 
{ 
public: 
    HttpProxyThreadBrowser(QTcpSocket outgoingSocket,QTcpSocket browserSocket,QObject *parent = 0); 
    ~HttpProxyThreadBrowser(){}; 
    void run(); 

private: 
    QTcpSocket outgoingSocket; 
    QTcpSocket browserSocket; 

}; 

Và tôi xác định lớp học ở đây trong pastebin để không làm bạn chán. Thật không may tôi không thể tìm hiểu lý do tại sao vtable là không xác định. Xin vui lòng giúp đỡ.

httpproxythreadbrowser.cpp:5: undefined reference to `vtable for HttpProxyThreadBrowser 
collect2: ld returned 1 exit status 
+0

Theo [tài liệu] (http://qt-project.org/doc/qt-4.8/qthread.html#run), chạy là thành viên được bảo vệ, không phải công khai. Tôi nghi ngờ đó sẽ là nguồn gốc của lỗi của bạn mặc dù. – obmarg

+0

@obmarg: Đó là, kể từ khi chạy là ảo, và anh ta không bao giờ định nghĩa nó. – PlasmaHH

+0

Mmmm ... Biên soạn bởi tôi. 4.7.4 + 4.8.0 trên MinGw. Bạn đang sử dụng hệ điều hành nào/Qt ver? – Koying

Trả lời

4

Bạn không thể sao chép QTcpSocket giây, do đó, nó có thể gây ra các lỗi khó hiểu khác nếu bạn cố gắng chuyển chúng bằng bản sao thay vì theo địa chỉ.

HttpProxyThreadBrowser(QTcpSocket * outgoingSocket,QTcpSocket * browserSocket,QObject *parent = 0); 

private: 
    QTcpSocket* outgoingSocket; 
    QTcpSocket* browserSocket; 

Và hoàn toàn biên soạn lại dự án của bạn có thể hữu ích, khi bạn thay đổi tệp tiêu đề, vì qmake tạo ra Makefile đôi khi có thể không nhận thấy những thay đổi.

+1

Một giải pháp khác là vượt qua QTcpSocket bằng cách tham khảo, ví dụ HttpProxyThreadBrowser (QTcpSocket & outgoingSocket, QTcpSocket & browserSocket, QObject * parent = 0); – Koying

+0

Cảm ơn rất nhiều bạn. Nhưng nó làm cho tôi tự hỏi tại sao tôi không thể sao chép QTcpSockets nhưng thats một câu chuyện cho một ngày khác. –

3

Điều này thường do không liên kết các tệp được tạo bởi automoc.

Trước tiên, bạn cần chạy tự động trên các tiêu đề mà các lớp sử dụng Q_OBJECT được xác định, trong trường hợp "httpproxythreadbrowser.h" của bạn. Điều này sẽ tạo ra một tập tin "* .moc".

Bây giờ, có hai cách tiếp cận phổ biến để tiếp tục. Hoặc bạn có thể #include tệp .moc ở cuối tệp .cpp của bạn với định nghĩa lớp hoặc bạn có thể chuyển nó vào trình biên dịch dưới dạng tệp nguồn anoher.

10

Trình phá hủy ngầm ngụ ý virtual vì lớp cơ sở có d'tor ảo.

Trình biên dịch GNU phát ra vtable cùng với phương thức ảo không nội tuyến đầu tiên ("phương thức khóa"). Khi d'tor của bạn được định nghĩa bên trong lớp, nó là hoàn toàn ảo, và vì không có phương thức ảo khác, bạn không có phương thức quan trọng.

Không có trường hợp sử dụng khi lớp bê tông chỉ có các phương thức nội tuyến ảo, vì chúng chỉ có thể được gạch chân vào các lớp dẫn xuất.

Tôi muốn di chuyển định nghĩa của dtor sang tệp triển khai.

Tôi không chắc chắn bạn có cần sử dụng moc tại đây hay không hoặc nếu QThread dẫn xuất không hoạt động (IIRC bạn chỉ cần cho nhà khai thác truyền của Qt và tín hiệu/vị trí).

7

Tôi cũng gặp lỗi undefined reference to vtable và làm theo các bước trong Undefined reference to vtable... Q_OBJECT macro, điều đó đã thúc đẩy tôi chạy qmake và ... nó đã hoạt động!

+0

Cảm ơn bạn! Bạn đã cứu mạng tôi! –

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