【问题标题】:How to use these variable in another function?如何在另一个函数中使用这些变量?
【发布时间】:2012-12-29 08:34:46
【问题描述】:

我正在疯狂地尝试在同一文件的另一个函数中使用变量:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

{

    QLineEdit * street1BetSize = new QLineEdit("0"); // want to use these QLineEdit's
    QLineEdit * street2BetSize = new QLineEdit("0");
    QLineEdit * street3BetSize = new QLineEdit("0");
    QLineEdit * street4BetSize = new QLineEdit("0");
    QLineEdit * street5BetSize = new QLineEdit("0");

}

想在这里使用这些变量:

void MainWindow::runButtonClicked()
{
    QVector<card> vDealt = cardDeck.deal_rand_cards(vDeck,3);
    //qDebug()<<vStreetBets[0];

    streetBetsList << street1BetSize << street2BetSize << street3BetSize << street4BetSize << street5BetSize;
    QVector<int> vStreetBets;
    for(int i=0;i<5;i++)
    {
         vStreetBets.append(streetBetsList[i]->text().toInt());
         qDebug()<<"street bet: "<<vStreetBets[i];
    }
}

因为它在这里,我得到了

警告:C4189: 'street5BetSize' : 局部变量已初始化但未引用

error: C2065: 'street5BetSize' : undeclared identifier

每一个。

我尝试将 extern QLineEdit * street1BetSize; 添加到 mainwindow.h,但这给了我一个“未解决的外部”错误。

【问题讨论】:

  • 您应该拿起一本好的 C++ 书籍并学习它,并阅读 Qt 示例/教程。这些变量应该被定义为类成员——如果你不知道怎么做,那么你还没有足够的基本 C++ 知识。

标签: c++ variables undeclared-identifier


【解决方案1】:

street1BetSize to street5BetSize 中的变量是 MainWindow 构造函数中的局部变量,它们对其他函数不可见。要使其他类成员函数能够访问它们,您可以将它们提升为 MainWindow 类成员,以便在类之间共享变量状态。而不是很多变量指针,使用std::vector的QLineEdit对象应该是更好的解决方案吧?

class MainWindow
{
public:
   MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    streetBetSizes(5,QLineEdit("0"))
private:
   // other member
   std::vector<QLineEdit> streetBetSizes;
};

【讨论】:

    【解决方案2】:

    如果您要为每个MainWindow 分配五个QLineEdit,那么您希望他们成为您班级的成员。只需将它们添加到您的类定义中:

    class MainWindow
    {
      // ...
     private:
      // ...
      QLineEdit* street1BetSize;
      QLineEdit* street2BetSize;
      QLineEdit* street3BetSize;
      QLineEdit* street4BetSize;
      QLineEdit* street5BetSize;
    }
    

    现在,每个 MainWindow 对象将有 5 个指向 QLineEdit 的指针。这些构成了该对象的 state 的一部分,并且可以被它的任何成员函数访问。现在将您的构造函数更改为以下内容,这样您就不会重新定义名称:

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        street1BetSize = new QLineEdit("0");
        street2BetSize = new QLineEdit("0");
        street3BetSize = new QLineEdit("0");
        street4BetSize = new QLineEdit("0");
        street5BetSize = new QLineEdit("0");
    }
    

    事实上,你最好使用成员初始化列表,就像你对QMainWindowui所做的那样:

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent), ui(new Ui::MainWindow),
        street1BetSize(new QLineEdit("0")), street2BetSize(new QLineEdit("0")),
        street3BetSize(new QLineEdit("0")), street4BetSize(new QLineEdit("0")),
        street5BetSize(new QLineEdit("0"))
    { }
    

    现在你的构造函数不需要做任何工作了。

    现在您可以在MainWindow的其他成员功能中参考street1BetSize和朋友。但是,当您有编号的变量时,总是很可疑,例如streetXBetSize。这似乎是一个数组或容器的好地方。为什么不尝试std::vector&lt;QLineEdit&gt;,然后您可以根据需要添加和删除QLineEdits。您的类定义现在将具有:

    class MainWindow
    {
      // ...
     private:
      // ...
      std::vector<QLineEdit> streetBetSizes;
    }
    

    你的构造函数现在可以简单地做:

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent), ui(new Ui::MainWindow)
    {
      for (int i = 0; i < 5; i++) {
        streetBetSizes.push_back(new QLineEdit("0"));
      }
    }
    

    【讨论】:

      【解决方案3】:

      将变量声明为MainWindow的成员,然后在构造函数中初始化它们:

      class MainWindow : public QMainWindow
      {
          ...
      
      private:
          QLineEdit* m_street1BetSize;
          QLineEdit* m_street2BetSize;
          QLineEdit* m_street3BetSize;
          QLineEdit* m_street4BetSize;
          QLineEdit* m_street5BetSize;
      };
      
      MainWindow::MainWindow(QWidget *parent) :
          QMainWindow(parent),
          ui(new Ui::MainWindow)
      {
          m_street1BetSize = new QLineEdit("0"); // want to use these QLineEdit's
          m_street2BetSize = new QLineEdit("0");
          m_street3BetSize = new QLineEdit("0");
          m_street4BetSize = new QLineEdit("0");
          m_street5BetSize = new QLineEdit("0");
      }
      

      那么你可以在MainWindow的任何方法中使用它们。

      【讨论】:

        猜你喜欢
        • 2014-06-07
        • 2013-04-22
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        • 2015-02-25
        相关资源
        最近更新 更多