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
答案 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,而不是静态。