2011-05-28 53 views
0
 queue1.h  mainwindow.h 
     /   /
     A.h---Mainwindow.cpp 

甲#包括隊列1 Mainwidow來#include甲 A和主窗口都需要使用隊列1之一instanse,所以我以類似的定義爲「靜態隊列1 Q1;」 然後在A.h我在q1中按「A」,但是當我嘗試在mainwindow中輸出它時,我得到了垃圾。 當我嘗試推動mainwindow.h內的「mainwindow」,然後輸出它是好的。 我使用Qt 4.7.0,贏得7隊列發生了什麼? (C++)

queue1.h

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

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

#endif // QUEUE1_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(」 主窗口「); 「該程序將首先輸出「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 
+1

問題是? – 2011-05-28 12:51:25

+0

爲什麼我不能輸出「A」,它會發生什麼,爲什麼 – Stals 2011-05-28 12:52:36

回答

3

static並不意味着你的意思它在這種情況下 - 它帶走外部鏈接從一個符號,這意味着它只能將一個給定的翻譯單元內可見。而且,由於您在包含兩個單元的標題中包含它,因此您的類將有兩個不同的實例 - 因此,當您推入A時,將推入A中的隊列,而不是mainwindow中的隊列。

解決的辦法是聲明變量爲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; )。

+0

沒有改變,它仍然輸出垃圾... – Stals 2011-05-28 13:04:06

+0

@Stals:你是否刪除該靜態變量?重建所有單元,如果問題仍然存在,請使用調試器。 – 2011-05-28 13:07:32

+0

奇怪的是,它在這個測試項目中不起作用,但在一個主要項目中工作......但無論如何感謝。 – Stals 2011-05-28 13:10:35

0

將q1聲明爲extern,而不是靜態的。