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 的回调。我无法更改这些参数。但是,我确实需要访问我传递给构造函数的数据库实例 MyDb(我什至这样做对吗?)。这就是我从 main.cpp 传递它的方式:

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

当我尝试从其中一个回调访问 realtimeDb 时,我得到:

error: 'realtimeDb' was not declared in this scope

有任何想法吗?谢谢!

4

3 回答 3

5

您需要在您的类中创建一个成员变量来存储您在构造函数中传递它的引用。当前,您正在传递对对象的 const 引用,但该类对它不做任何事情。您需要将MyDb对象的详细信息存储为成员变量。这可以是引用、常量引用或指向的实例的指针,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

这不是您拥有的真正的“类范围”,而是构造函数范围。

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

你可以这样做:

流光.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 回答
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 回答