2010-02-04 36 views
5

Tôi có hai tệp DLL a.dll và b.dll và trong mỗi tệp tôi có một lớp AClass và BClass.
Tôi muốn có cả AClass và BClass kế thừa và triển khai cùng một giao diện AbsBase là lớp trừu tượng thuần túy.
Trong mỗi lớp, tôi thiết lập #defines cho __declspec (dllimport) và __declspect (dllexport). Khi tôi đang cố gắng để biên dịch tôi có được điều này:Lớp cơ sở thuần túy cần được xuất từ ​​DLL?

C4275 cảnh báo: không dll giao diện lớp 'Aclass' được sử dụng làm cơ sở cho lớp dll giao diện 'AbsBase'

mà về cơ bản muốn tôi tuyên bố AbsBase như __declspec (dllexport)
Nhưng nếu trình biên dịch sẽ có nó theo cách của mình, tôi sẽ phải tuyên bố AbsBase được xuất khẩu từ cả hai a.dll và b.dll.

Tại sao giao diện của lớp cần được xuất?
Có cách nào xung quanh nó không? tôi có nên thực sự xuất AbsBase từ cả hai tệp DLL? không phải là có một cái gì đó vốn đã sai với điều này? (Tôi sẽ cần phải xác định một macro XXX_EXPORT mới ..)

+0

Bạn có thể tạo một tệp DLL thứ ba không? – jmucchiello

+0

hiển thị cho chúng tôi bảng kê giao diện và lớp học của bạn. –

Trả lời

3

Dường như cảnh báo trình biên dịch của nó và không phải là lỗi, vì vậy nó vẫn hoạt động. Trình biên dịch chỉ cho bạn biết rằng bạn đang làm điều gì đó giúp bạn dễ dàng xoay xở. Nó nên được chấp nhận hoàn toàn để làm điều này miễn là cả hai DLL và chương trình lõi đồng ý về định nghĩa của lớp cơ sở.

Bạn sẽ có thể sử dụng một pragma để ngăn chặn các cảnh báo:

http://forums.devx.com/archive/index.php/t-84785.html

+1

Phản hồi từ "ralph" trong chuỗi đó đang sáng. @ OP: Bạn sẽ không gặp phải vấn đề ralph vấn đề đó với điều kiện là lớp cơ sở của bạn vẫn còn trừu tượng thuần túy * mãi mãi *. –

+0

Làm cho lớp cơ sở hoàn toàn thuần ảo giải quyết vấn đề. – shoosh

0

Tôi có một mẹo:

class Base { 
    public: 
    virtual void f() = 0; 
    virtual void g() = 0; 
    virtual ~Base(); 
}; 

class A: public Base { 
    public: 
    virtual void f(); 
    virtual void g(); 
}; 

class B: public Base { 
    public: 
    virtual void g(); // REVERSE ORDER 
    virtual void f(); 
}; 

Trình tự của f và g trong bảng phương thức ảo được quy định trong lớp cơ sở và thông tin này là rất cần thiết.

+0

Vâng, đúng thế. Đó là lý do tại sao nó nằm trong tập tin header. –

1

Đây là điều phải băn khoăn về. Trình biên dịch đã phát hiện ra rằng mã trong lớp cơ sở có thể chạy. Nó sẽ không thuần túy là một phương pháp ảo, nó biết cách lọc chúng. Có lẽ một nhà xây dựng hoặc một destructor? Chế độ thất bại là bố trí bộ nhớ của đối tượng lớp có thể không giống nhau trong mã máy khách so với DLL. Thời gian chạy tình trạng lộn xộn nguyên nhân này là rất khó chẩn đoán.

Bạn sẽ không sao nếu bạn có thể đảm bảo rằng cả khách và DLL đều được biên dịch với cùng một cài đặt biên dịch và liên kết, sử dụng cùng một phiên bản CRT và các công cụ đó. Bạn có thể làm cho lớp cơ sở được đảm bảo trừu tượng bằng cách sử dụng từ khóa __interface không chuẩn thay vì lớp.

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