0

Streamer というクラスがあります。これがStreamer.hです

class Streamer {

public:
    Streamer(const MyDb& realtimeDb);
    virtual ~Streamer(void);

private:
    virtual void    callback_1(T_UPDATE pUpdate);
    virtual void    callback_2(Q_UPDATE pUpdate);
};

これがStreamer.cppです

Streamer::Streamer(const MyDb& realtimeDb) {
}

Streamer::~Streamer(void) {
}

void Streamer::callback_1(T_UPDATE pUpdate) {
    // I need to do something with pUpdate and realtimeDb here, like this:
    // Getting a cursor from db (works fine in main.cpp, but not in callback)
    Dbc *cursorp;
    realtimeDb.getDb().cursor(NULL, &cursorp, 0);
}

void Streamer::callback_2(Q_UPDATE pUpdate) {
    // I need to do something with pUpdate and realtimeDb here, like this:
    // Getting a cursor from db (works fine in main.cpp, but not in callback)
    Dbc *cursorp;
    realtimeDb.getDb().cursor(NULL, &cursorp, 0);
}

Streamer には、API からのコールバックである 2 つのメソッドがあります。これらのパラメータを変更できません。ただし、コンストラクターに渡すデータベース インスタンス MyDb にアクセスする必要があります (正しく行っているでしょうか?)。これは、main.cpp から渡す方法です。

MyDb realtimeDb(databasePath, databaseName);
Streamer streamer(realtimeDb);

コールバックの 1 つから realtimeDb にアクセスしようとすると、次のようになります。

error: 'realtimeDb' was not declared in this scope

何か案は?ありがとう!

4

3 に答える 3

5

コンストラクターで渡す参照を格納するには、クラスにメンバー変数を作成する必要があります。現在、オブジェクトへの const 参照を渡していますが、クラスはそれに対して何もしません。MyDbオブジェクトの詳細をメンバー変数として保存する必要があります。これは、インスタンスへの参照、const 参照、またはポインターである可能MyDb性がありますが、作成後にクラスがアクセスできるようにする必要があります。

何かのようなもの

class Streamer {

public:
   Streamer(const MyDb& Db);
   virtual ~Streamer(void);

private:
   const MyDb& realtimeDb;
   virtual void    callback_1(T_UPDATE pUpdate);
   virtual void    callback_2(Q_UPDATE pUpdate);
};

コンストラクタは次のようになります

Streamer::Streamer(const MyDb& Db) 
     : realtimeDb(Db)                // initialise the reference here
{
}

必要に応じて参照の代わりにポインターを使用することもできますが、それに応じてメンバー変数を変更する必要があります

于 2012-08-15T18:47:44.867 に答える
1

realtimeDb はコンストラクターの引数として定義されていますが、コールバックでは定義されていません。

おそらくやりたいことは、次のように、そのオブジェクトへの参照を保持することです。

class Streamer {

public:
    Streamer(MyDb& realtimeDb); // I doubt you need the "const"...
    virtual ~Streamer(void);

private:
    virtual void    callback_1(T_UPDATE pUpdate);
    virtual void    callback_2(Q_UPDATE pUpdate);
    MyDb& m_realtimeDb;
};

そしてあなたの実装:

Streamer::Streamer(const MyDb& realtimeDb) : m_realtimeDb(realtimeDb) {
}

Streamer::~Streamer(void) {
}

void Streamer::callback_1(T_UPDATE pUpdate) {
    // I need to do something with pUpdate and realtimeDb here, like this:
    // Getting a cursor from db (works fine in main.cpp, but not in callback)
    Dbc *cursorp;
    m_realtimeDb.getDb().cursor(NULL, &cursorp, 0);
}

void Streamer::callback_2(Q_UPDATE pUpdate) {
    // I need to do something with pUpdate and realtimeDb here, like this:
    // Getting a cursor from db (works fine in main.cpp, but not in callback)
    Dbc *cursorp;
    m_realtimeDb.getDb().cursor(NULL, &cursorp, 0);
}
于 2012-08-15T18:56:36.433 に答える
1

これは実際には「クラス スコープ」ではなく、コンストラクタ スコープです。

Streamer::Streamer(const MyDb& realtimeDb)
{
    //realtimeDb exists only here
}

次のようなことができます。

streamer.h

class Streamer {

public:
    Streamer(const MyDb& realtimeDb);
    virtual ~Streamer(void);

private:
    MyDb* realtimeDb;
    virtual void    callback_1(T_UPDATE pUpdate);
    virtual void    callback_2(Q_UPDATE pUpdate);
};

ストリーマー.cpp

Streamer::Streamer(const MyDb& realtimeDb) {
    this->realtimeDb = &realtimeDb;
}

Streamer::~Streamer(void) {
}

void Streamer::callback_1(T_UPDATE pUpdate) {
    // I need to do something with pUpdate and realtimeDb here, like this:
    // Getting a cursor from db (works fine in main.cpp, but not in callback)
    Dbc *cursorp;
    realtimeDb->getDb().cursor(NULL, &cursorp, 0);
}

void Streamer::callback_2(Q_UPDATE pUpdate) {
    // I need to do something with pUpdate and realtimeDb here, like this:
    // Getting a cursor from db (works fine in main.cpp, but not in callback)
    Dbc *cursorp;
    realtimeDb->getDb().cursor(NULL, &cursorp, 0);
}

このように realtimeDb ポインターはクラス スコープ内のどこにでも存在するため、すべての非静的メソッドがアクセスできます。

ただし、ポインタなので構文が異なります。

また、注意してください - 誰かがデフォルトのコンストラクターで Streamer を宣言すると、realtimeDb は NULL になり、コールバックは未定義の動作を呼び出します。

于 2012-08-15T18:52:53.303 に答える