Search code examples
c++berkeley-db

Having trouble with class scope


I have a class called Streamer. Here is 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);
};

Here is 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 has two methods that are callbacks from an API. I can't change these parameters. I do, however, need to access the database instance MyDb that I am passing to the constructor (am I even doing that right?). This is how I am passing it, from main.cpp:

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

When I try to access realtimeDb from one of the callbacks, I get:

error: 'realtimeDb' was not declared in this scope

Any ideas? Thanks!


Solution

  • You need to create a member variable in your class to store the reference that you pass it in the constructor. Currently, you are passing in a const reference to the object but the class does nothing with it. You need to store the details of the MyDb object as a member variable. This could be a reference, const reference, or pointer to an instance of MyDb but you need something so that your class can access it once it is created.

    Something like

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

    then the constructor will be

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

    you could also use a pointer instead of a reference if you wanted although you would need to modify the member variable accordingly