1

我正在编写一个 dll,其中包含一个 c++ 类定义和一个基于代理模式的核心程序,如本教程所述:http ://www.linuxjournal.com/article/3687

具体来说,这个dll在加载到核心程序上后,会在核心程序的数据结构中填入它的定义,包括类名、方法名、方法的函数指针。

但是,我想针对不同种类的类修改这种模式,而不是在文章中只修改一种基类,这就是我使用函数指针的原因。

我的程序如下:

//the base class
class common_object{
};

//this factory is used for storing constructor for each c++ class in the dll.
typedef common_object *maker_t();
extern map< string, maker_t* > factory;

//store all the methods of a class
//string: method's name
typedef map<string, proxy::method> method_map;
//string: class's name
extern map<string, method_map> class_map_;

// our global factory
template<typename T>
class proxy {
public:
    typedef int (T::*mfp)(lua_State *L);
    typedef struct {
        const char *class_name;
        const char *method_name;
        mfp mfunc;
    } method;

    proxy() {
        std::cout << "circle proxy" << endl;
        // fill method table with methods from class T
        // initialize method information for the circle class
        method_map method_map_;
        for (method *m = T::methods;m->method_name; m++) {
            /* edited by Snaily: shouldn't it be const RegType *l ... ? */
            method m1;
            m1.class_name = T::className;
            m1.method_name = m->method_name;
            m1.mfunc = m->mfunc;
            method_map_[m1.method_name] = m1;
        }
        //register the circle class' description
        class_map_[T::class_name] = method_map_;
    }
};

在这个程序中,我将核心问题的两个数据结构外部化:

  1. class_map:包含核心程序中加载的dll中的所有类。方法图:
  2. method_map:包含每个类的所有方法的描述。class_map 和方法之间的关系是一对多的。但是,我遇到了class_map_和method_map的声明顺序问题。具体来说,我在类Proxy之外extern class_map,但我还必须在这个类内部定义方法结构。我尝试在以下链接中使用前向声明:何时可以使用前向声明?,但它不起作用。

我希望看到您对我的问题的解决方案。非常感谢

4

0 回答 0