1

このチュートリアルで説明されているように、C++ クラス定義とプロキシ パターンに基づくコア プログラムを含む dll を作成しています: http://www.linuxjournal.com/article/3687

具体的には、この dll は、コア プログラムにロードされた後、コア プログラムのデータ構造内のクラス名、メソッド名、およびメソッドの関数ポインタを含む定義を埋めます。

ただし、この記事では 1 つの基本的な種類だけではなく、さまざまな種類のクラスに合わせてこのパターンを変更したいと考えています。これが、関数ポインターを使用する理由です。

私のプログラムは次のとおりです。

//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_;
    }
};

このプログラムでは、コア問題の 2 つのデータ構造体を抽出します。

  1. class_map: コア プログラムにロードされた dll にすべてのクラスが含まれます。method_map:
  2. method_map: 各クラスのすべてのメソッドの説明が含まれています。class_map と method の関係は 1 対多です。しかし、class_map_ と method_map の宣言順序に問題があります。具体的には、クラス Proxy の外に class_map を extern しますが、このクラス内にもメソッド構造を定義する必要があります。次のリンクで前方宣言を使用しようとしました:いつ前方宣言を使用できますか? 、しかし、それは動作しません。

私の問題についてあなたの解決策を見たいと思っています。本当にありがとう

4

0 に答える 0