2010-04-25 24 views
5

Tôi có một chương trình trong C++ với các plugin (libs động). Trong chương trình chính, tôi muốn thực hiện một hàm tĩnh để kiểm tra xem tôi có thể tạo một đối tượng thuộc loại này hay không.Buộc thực hiện lại chức năng tĩnh trong các lớp kế thừa

Một ví dụ mà không libs động (không neccesary để hiểu được vấn đề):

#include "libs/parent.h" 
#include "libs/one.h" 
#include "libs/two.h" 

int main(int argc, char * argv[]) 
{ 
    Parent* obj; 

    if (One::match(argv[1])) 
     obj = new One(); 
    else if (Two::match(argv[1])) 
     obj = new Two(); 
} 

Bây giờ, tôi có một lớp giao diện có tên phụ huynh. Tất cả các plugin được kế thừa từ lớp này. Lý tưởng nhất, tôi có một hàm tĩnh ảo trong Parent match, và tất cả các plugin cần phải reimplement chức năng này.

Sự cố với mã này là tôi không thể thực hiện chức năng ảo tĩnh trong C++, vì vậy tôi không biết cách giải quyết vấn đề.

Xin lỗi vì mi tiếng anh, tôi đã cố gắng hết

+0

Nếu hàm 'match()' là tĩnh, bạn sẽ không gọi nó là 'One :: match()'? Tại sao nó phải tĩnh? –

+0

Xin lỗi, tôi đã sửa lỗi Nó phải tĩnh vì tôi cần gọi nó trước khi tạo đối tượng – pacopepe222

+0

Không phải lo lắng, tôi nghĩ sử dụng một phương pháp ảo thuần túy sẽ làm việc cho bạn, nhưng đó không phải là tĩnh. Vì vậy, có lẽ câu trả lời của người khác có thể giúp bạn nhiều hơn. –

Trả lời

5

Những gì bạn có ở đây là cổ điển nhà máy mẫu của tôi. Bạn muốn tạo một giao diện có tên IPluginFactory có hai phương thức - matchcreate (hoặc, tùy chọn, kết hợp cả hai trong một phương thức). Sau đó, mỗi DLL plugin của bạn sẽ có một lớp thực hiện giao diện này.

Parent obj; 
    IPluginFactory *one = new OneFactory(); 
    IPluginFactory *two = new TwoFactory(); 

    if (one->match(argv[1])) 
     obj = one->createObj(); 
    else if (two->match(argv[1])) 
     obj = two->createObj(); 
+1

Câu trả lời này không giải quyết các hàm tĩnh ảo. –

+0

Nó không giải quyết được câu hỏi. –

+0

Tôi không thấy điều này liên quan đến các hàm tĩnh như thế nào. Bạn có thể khai sáng cho tôi không? –

1

Bạn có thể thêm một số static string vào mỗi plugin của mình, có thể giữ tên của nó. Hoặc thực hiện một số cấu trúc được gọi là PluginID và thêm string vào cấu trúc này (và có thể là một cái gì đó khác plugin cụ thể).

Hiện tại, kết hợp trong thời gian chạy dường như trở nên rất đơn giản. Chỉ cần kiểm tra xem chuỗi nhận dạng tĩnh từ plugin của bạn có phù hợp với argv của bạn hay không.

Đây là triển khai thường được sử dụng của cái gọi là "của bạn-riêng-và-đơn giản-rtti", đoán nó sẽ giải quyết vấn đề của bạn.

+0

Phương thức 'match' không nhất thiết phải kiểm tra sự bình đẳng đơn giản. –

+0

Tôi đồng ý rằng việc tạo ra một nhà máy đối tượng sẽ là một giải pháp tốt hơn, nhưng trực giác của tôi thực sự nói rằng việc thực hiện rtti đơn giản này là những gì sẽ làm việc trong trường hợp cụ thể này –

+0

Vấn đề là phương thức match() phức tạp hơn so sánh đơn giản của chuỗi được truyền bởi argv, nhưng cảm ơn bạn! – pacopepe222

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