C++ C++;在getter方法未就绪时调用它

C++ C++;在getter方法未就绪时调用它,c++,C++,我正在做一个项目,它可以工作,但它真的很混乱,所以我试图通过移动东西来清理它 下面是包含getter方法的类的简短版本 Link::Link { jsonUrl = QUrl("www.example.json"); QNetworkAccessManager *nam = new QNetworkAccessManager(this); connect(nam,SIGNAL(finished(QNetworkReply*)),this,SLOT(downloadFini

我正在做一个项目,它可以工作,但它真的很混乱,所以我试图通过移动东西来清理它

下面是包含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的类的简短版本

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

class Commands
{
private:
    Link link; 
}
构造函数中的源代码

Commands::Commands()
{
    addCommand("!test", link.getString()); 
}
问题是当我尝试这样做时,我认为Commands构造函数首先运行,而Link类中的字符串还没有准备好,因此从
Link.getString()
中产生的字符串是空的。在调用命令构造函数中的
Link.getString()
之前,是否有一种方法可以等待Link类完成它的工作并填充字符串?不确定这是否重要,但我的大部分代码都是用Qt编写的

我希望你们能理解我想问的。我的术语真的很差


编辑:在我的链接类中添加了更多内容

当首先调用命令的构造函数(在本例中为Commands())时,它会在Commands类中创建所有变量(它们未初始化)。所述链接是通过link()创建的。您可能想做的是在Link()构造函数中使用jsonstaff()(它也会创建所有成员变量),请注意,它会创建变量。在这种情况下,它会使用基本costructor创建字符串-它会创建空字符串。)请尝试以下方法填充字符串:

 Link() {
    jsonStuff(); // string will be set
 }
也可以通过初始化部分对其进行初始化:

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

另外,您可能希望从getString()函数返回对字符串的引用。引用意味着它不创建额外的副本,并返回存储在链接中的字符串,所以您可以在调用getString()的函数中更改字符串。另外,如果它是只读的,您应该使用const reference。

当首先调用命令的构造函数(在本例中为Commands())时,它会在Commands类中创建所有变量(它们未初始化)。所述链接是通过link()创建的。您可能想做的是在Link()构造函数中使用jsonstaff()(它也会创建所有成员变量),请注意,它会创建变量。在这种情况下,它会使用基本costructor创建字符串-它会创建空字符串。)请尝试以下方法填充字符串:

 Link() {
    jsonStuff(); // string will be set
 }
也可以通过初始化部分对其进行初始化:

Link() : string("Text") { }
另外,您可能希望从getString()函数返回对字符串的引用。引用意味着它不创建额外的副本,并返回存储在链接中的字符串,所以您可以在调用getString()的函数中更改字符串。此外,如果它是只读的,则应使用常量引用

在调用
命令的构造函数中的
Link.getString()
之前,是否有方法等待Link类完成它的工作并填充字符串

当然可以。
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);
  });
}
在调用
命令的构造函数中的
Link.getString()
之前,是否有方法等待Link类完成它的工作并填充字符串

当然可以。
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);
  });
}

我还是有点困惑。你能在整个(最小的)程序中发布一个片段(或每个文件一个片段)吗?我还是有点困惑。你能用你的整个(最小的)程序发布一个片段(或每个文件一个片段)吗?在某些情况下,这是一个有效的解决方案;OP确认
jsonstaff()
可以调用吗?很快创建了
Link
对象?我很确定我不能这样做,因为我使用的是Qt的信号和插槽机制,在我可以从url读取json数据之前,我必须等待下载完成信号发出,然后才能开始将json数据读入数组。如果您问为什么它是空的,那是因为它未初始化。定义初始化它的构造函数应该可以解决这个问题。无论如何,你能发布整个链接类吗?在某些情况下,这是一个有效的解决方案;OP确认
jsonstaff()
可以调用吗?很快创建了
Link
对象?我很确定我不能这样做,因为我使用的是Qt的信号和插槽机制,在我可以从url读取json数据之前,我必须等待下载完成信号发出,然后才能开始将json数据读入数组。如果您问为什么它是空的,那是因为它未初始化。定义初始化它的构造函数应该可以解决这个问题。无论如何,你能发布整个链接类吗?