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