簡體   English   中英

C ++在未准備好時調用getter方法

[英]C++ Calling a getter method when it is not ready

我正在開發一個項目,並且可以正常工作,但是它確實很雜亂,因此我試圖通過四處移動來清理它。

這是包含getter方法的類的簡短版本

Link::Link
{
    jsonUrl = QUrl("www.example.json");
    QNetworkAccessManager *nam = new QNetworkAccessManager(this);
    connect(nam,SIGNAL(finished(QNetworkReply*)),this,SLOT(downloadFinished(QNetworkReply*)));
    QNetworkRequest request(jsonUrl);
    nam->get(request)
}
void Link::downloadFinished(QNetworkReply *reply)
{
    jsonArray = reply->readAll();
    jsonStuff();
}
void Link::jsonStuff()
{
    //does a bunch of json stuff then gets a string
    string = map["url"].toString();    
}
QString Link::getString()
{   
    return string;
}

這是在構造函數中調用getter的類的簡短版本

標頭

class Commands
{
private:
    Link link; 
}

構造函數內部的源代碼

Commands::Commands()
{
    addCommand("!test", link.getString()); 
}

問題是當我嘗試這樣做時,我認為Commands構造函數首先運行,並且Link類中的字符串尚未准備好,因此從link.getString()出來的字符串為空。 有沒有辦法等到Link類完成其工作並填滿字符串,然后再調用link.getString()構造函數中的link.getString() 不知道這是否重要,但是我的大部分代碼都是用Qt編寫的

我希望你們能理解我要問的問題。 我的術語真的很差。

編輯:添加更多到我的鏈接類

當首先調用Commands的構造函數(在這種情況下為Commands())時,它將在Commands類中創建所有變量(它們是未初始化的)。 所說的鏈接是通過Link()創建的。 您可能想做的是在Link()構造函數中使用jsonStuff()(它也會創建所有成員變量),請注意,在這種情況下,它會創建變量並使用基本構造函數創建字符串-它會創建空字符串。)嘗試按以下步驟填充字符串:

 Link() {
    jsonStuff(); // string will be set
 }

或者,您可以通過初始化部分對其進行初始化:

Link() : string("Text") { }

另外,您可能想從getString()函數返回對字符串的引用。 引用意味着它不會創建其他副本,它會返回存儲在Link中的字符串,因此您可以在調用getString()的函數中更改字符串。 另外,如果它是只讀的,則應使用const引用。

有沒有辦法等到Link類完成做它的東西,並調用之前填補了串link.getString()的構造函數中Commands

當然。 Link類必須是一個QObject ,它在更改其屬性后會發出信號-大概是基於對其網絡請求的答復。

class Link : public QObject {
  Q_OBJECT
  Q_PROPERTY(QString string READ string WRITE setString NOTIFY stringChanged)
  QString m_string;
public:
  void jsonStuff() {
    ...
    connect(reply, &QNetworkReply::finished, this, [this]{
      ...
      setString(map["url"].toString());
    });
  }
  void setString(const QString &s) {
    if (m_string == s) return;
    m_string = s;
    emit stringChanged(m_string);
  }
  QString string() const { return m_string; }
  Q_SIGNAL void stringChanged(const QString &);
};

鏈接就緒后,您可以添加命令:

Commands::Commands()
{
  connect(&link, &Link::stringChanged, this, [this](const QString &string){
    if (!string.isEmpty()) addCommand("!test", string);
  });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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