队列会发生什么? (C ++)

时间:2011-05-28 12:48:36

标签: c++ qt static

        queue1.h        mainwindow.h
        /               /
        A.h---Mainwindow.cpp

#includes queue1 Mainwidow #includes A A和MainWindow都需要使用queue1的一个instanse,所以我在A中定义它就像“static queue1 q1;” 然后在A.h我在q1中按“A”,但是当我尝试在主窗口输出它时,我得到了垃圾。 当我尝试在mainwindow.h中推送“mainwindow”然后输出它就可以了。 我正在使用Qt 4.7.0并赢得7。

queue1.h

#ifndef QUEUE1_H
#define QUEUE1_H
#include <queue>
#include <string>

class queue1
{
public:
    queue1();
   std::queue<std::string> q;
};

#endif // QUEUE1_H

A.H

#ifndef A_H
#define A_H
#include "queue1.h"
static queue1 q1;
class A
{
public:
    A(){q1.q.push("A");}
};

#endif // A_H

如果取消注释“q1.q.push(”mainwindow“);”该程序将首先输出“mainwondow”,然后输出垃圾。在该队列变空之后。

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "a.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //q1.q.push("mainwindow");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    ui->label->setText(q1.q.front().c_str());
    q1.q.pop();


}

对于这个测试项目,我没有改变mainwindow.h,但现在是。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private slots:
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H

2 个答案:

答案 0 :(得分:3)

static并不意味着它在这种情况下的意思 - 它从符号中消除了外部链接,这意味着它只能在给定的翻译单元中可见。并且因为你有两个单元所包含的标题,所以你的类会有两个不同的实例 - 所以当你推入A时,你会推送到A中的队列,而不是主窗口中的队列。

解决方案是将变量声明为extern,并仅在一个翻译单元中定义。

// in queue1.h
class queue1 { ... };
extern queue1 q1;

// in e.g. queue1.cpp
#include "queue1.h"
queue1 q1;

现在A和主窗口都将使用相同的队列(当然您需要从A.h中删除static queue1 q1; )。

答案 1 :(得分:0)

将q1声明为extern,而不是静态。