簡體   English   中英

課堂范圍有問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM