开发者

Force to reimplement a static function in inherit classes

开发者 https://www.devze.com 2022-12-27 21:55 出处:网络
I have a program in C++ with plugins (dynamic libs). In the main program, I want to execute a static function to check if i can create a object of this type.

I have a program in C++ with plugins (dynamic libs). In the main program, I want to execute a static function to check if i can create a object of this type.

An example without dynamic libs (aren't neccesary to understand the problem):

#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();
}

Now, i have a interface class named Parent. All plugins inherit from this class. Ideally, I have a virtual static function in Parent named match, and all the plugins need to reimplement this function.

The problem with this code is that i can't do a static virtual function in C++, so i don't know how to s开发者_运维知识库olve the problem.

Sorry for mi english, i did my best


What you have here is classic factory pattern. You want to create an interface named IPluginFactory which would have two methods - match and create (or, optionally, combine them both in a single method). Then each of your plugin DLLs would have a class that implements this interface.

    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();


You could add some static string to each of your plugins, that would hold it's name. Or make some struct called PluginID and add this string to this struct (and probably something else plugin-specific).

Now matching in runtime seems to become very simple. Just check whether that static identification string from your plugin matches your argv.

This is a commonly used implementation of a so-called "your-own-and-simple-rtti", guess it would solve your problems.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号