C++ 类范围有问题

C++ 类范围有问题,c++,berkeley-db,C++,Berkeley Db,我有一门课叫拖缆。这是拖缆 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::

我有一门课叫拖缆。这是拖缆

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::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);
}
Streamer有两种方法,它们是来自API的回调。我无法更改这些参数。但是,我确实需要访问传递给构造函数的数据库实例MyDb(我这样做对吗?)。以下是我通过main.cpp传递它的方式:

MyDb realtimeDb(databasePath, databaseName);
Streamer streamer(realtimeDb);
当我尝试从其中一个回调访问realtimeDb时,我得到:

error: 'realtimeDb' was not declared in this scope

有什么想法吗?谢谢

您需要在类中创建一个成员变量来存储在构造函数中传递的引用。当前,您正在向对象传递一个常量引用,但该类对此不做任何处理。您需要将
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
{
}
如果需要,您也可以使用指针而不是引用,尽管您需要相应地修改成员变量

这实际上不是您拥有的“类范围”,而是构造函数范围

Streamer::Streamer(const MyDb& realtimeDb)
{
    //realtimeDb exists only here
}
您可以这样做:

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;
};
拖缆

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

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::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,回调将调用未定义的行为。

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

在那个之前你有什么错误吗?不知道C++的内容,听起来完全像我想做的。这看起来像什么?有一个私有成员变量,如
MyDb&m_database
,它是对
MyDb
对象的引用,并在构造函数中使用构造函数的参数对其进行初始化。+1到目前为止,这是唯一一个在不改变代码语义的情况下回答问题的答案。好的,我想我快拿到了。我得到了这个错误
错误:将'const MyDb'作为'Db&MyDb::getDb()'的'this'参数传递会丢弃限定符
@nathancahill,这听起来像是您的
MyDb
类的错误。您可以尝试从成员变量中删除
常量
,并将其转换为常规引用。您还需要类似地将参数更改为构造函数(删除常量)。除此之外,我不能说这是另一个类的问题
private
this->realtimeDb=&realtimeDb
对于构造函数,我可以从回调中访问传递的实例?您可以对引用执行相同的操作,但是您应该与const-ness保持一致。这似乎是可行的,但我得到了以下错误:
错误:在“((Streamer*)This)->Streamer::realtimeDb”中请求成员“getDb”,属于非类类型“MyDb*”
此代码使用指针,因此不是
realtimeDb.getDb().cursor(NULL,&cursorp,0)使用
realtimeDb->getDb().cursor(NULL,&cursorp,0)