[英]Having trouble with class scope
我有一堂课叫做流光。 这是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
有任何想法吗? 谢谢!
您需要在类中创建一个成员变量,以将传递给它的引用存储在构造函数中。 当前,您正在传递对该对象的const引用,但该类对此不执行任何操作。 您需要将MyDb
对象的详细信息存储为成员变量。 它可以是MyDb
实例的引用,const引用或指针,但是您需要一些东西,以便您的类在创建后即可访问它。
就像是
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(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) {
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.