在类范围方面遇到问题
Having trouble with class scope
>我有一个名为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);
};
这是流光.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);
当我尝试从其中一个回调访问实时Db时,我得到:
error: 'realtimeDb' was not declared in this scope
有什么想法吗?谢谢!
您需要在类中创建一个成员变量来存储您在构造函数中传递它的引用。目前,您正在传递对该对象的 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
{
}
如果需要,也可以使用指针代替引用,尽管需要相应地修改成员变量
这不是真正的"类作用域",而是构造函数作用域。
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);
}
这样,实时 Db 指针将存在于类作用域中的任何位置,因此每个非静态方法都可以访问它。
但是,因为它是一个指针,所以语法会有所不同。
另外,要小心 - 如果有人使用默认构造函数声明 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);
}
相关文章:
- 编译包含字符串的代码时遇到问题
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 从其他类访问类时遇到问题
- 使用静态成员声明类时遇到问题
- C++ 填充数组时遇到问题
- 在将字符串放入字符串向量时遇到问题?
- 余数除法和不允许除以零 (c++) 时遇到问题
- 我在C++中使用 getline() 函数时遇到问题
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 在我的四叉树实现中遇到问题
- 在 c++ 中循环遍历数组时遇到问题
- 使用 MinGW 在 Windows 上构建 GLEW 时遇到问题
- 编译 Cilk Plus 程序时遇到问题
- 存储另一个函数返回的布尔数组时遇到问题
- 我在 OpenGL 中显示图像时遇到问题
- 我在解决此错误时遇到问题.我正在努力在主函数中传递数组
- 在 for 循环中更新两个变量时遇到问题C++
- 为什么我的程序在打开网络设备时遇到问题
- 在 Tensorflow C++ 中使用 FIFOQueue 时遇到问题
- 为什么我在虚幻引擎中的多态性和接口方面遇到问题?