Что происходит с очередью?(C ++) - PullRequest
0 голосов
/ 28 мая 2011
        queue1.h        mainwindow.h
        /               /
        A.h---Mainwindow.cpp

A #include queue1 Mainwidow #include A A и MainWindow должны использовать один экземпляр queue1, поэтому я определяю его в A как «static queue1 q1;»Затем в Ah я нажимаю «A» в q1, но когда я пытаюсь вывести его в главное окно, я получаю мусор.Когда я пытаюсь нажать «mainwindow» внутри mainwindow.h, а затем вывести его, все в порядке.Я использую 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

А *

#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 ]

3 голосов
/ 28 мая 2011

static не означает, что вы имеете в виду в этом контексте - он убирает внешнюю связь с символом, то есть он будет виден только в пределах данной единицы перевода. И поскольку он есть в заголовке, включенном двумя модулями, у вас будет два разных экземпляра вашего класса - поэтому, когда вы нажимаете A, вы перемещаетесь в очередь в A, а не в очередь в главном окне.

Решение состоит в том, чтобы объявить переменную как extern и определить ее только в одной единице перевода.

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

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

Теперь и A, и основное окно будут использовать одну и ту же очередь (конечно, вам нужно удалить static queue1 q1; из A.h).

0 голосов
/ 28 мая 2011

Объявление q1 как внешнего, а не статического.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...