0

我究竟做错了什么?

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "fileoperations.h"

namespace Ui {
class MainWindow;
}
class FileOperations;
class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_OpenButton_clicked();
    void on_SaveButton_clicked();
    void on_EncodeButton_clicked();
    void on_DecodeButton_clicked();
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

当我尝试编译和运行程序时,它说:

g:\ke\c++ projects\projects\qt\shitlencoder\mainwindow.h:18: error: C2079: 'MainWindow::FileController' uses undefined class 'FileOperations'

这是奇怪的事情,如果我改变'FileOperations FileController;' 到'FileOperations *FileController;'(显然这编译错误,因为你看不到的其余代码没有适应'->'而不是'。')然后如果我把它改回'FileOperations文件控制器;' 它让我编译一次程序(它工作正常),然后在我下次尝试编译它时出现错误。

我正在使用 Qt 5.0。

文件操作.h:

#ifndef FILEOPERATIONS_H
#define FILEOPERATIONS_H
#include "ui_mainwindow.h"
#include "mainwindow.h"
#include <QFileDialog>
#include <string>
#include <time.h>
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <fstream>
using namespace std;
class FileOperations
{
public:
    FileOperations();
    void SetInputFile(QString x);
    void SetOutputFile(QString x);
    void EncryptAndSave(Ui::MainWindow *NUI);
    void DecryptAndSave(Ui::MainWindow *NUI);
    void createid(int id, int id2);
    int GetCFuncion();
    void SetCFuncion(int x);
    long long Get_Size(string filename);
    bool Get_Toobig(string path);
    //DWORD WINAPI Thread_no_1();
private:
    string InputFilename;
    string OutputFilename;
    int CFuncion;//CurrentFunction;
    vector<int> conbyte1;
    vector<int> conbyte2;
    vector<int> opbyte1;
    vector<int> opbyte2;
    vector<int> passwordbytes;
};

#endif // FILEOPERATIONS_H
4

3 回答 3

3

我假设,在您的 .cpp 文件中,您正在使用

#include "fileoperations.h"

然后,在 中,由于您使用对象作为参数,因此fileoperations.hmainwindow.h再次包含了fileoperations.h哪个基本上正确的内容。FileOperations但是,由于守卫,class FileOperations这次编译器看不到,因此FileOperations在您的方法中用作参数时是未知的。您需要打破这种依赖关系:

fileoperations.h中,使用前向声明Ui::MainWindow并删除#include "mainwindow.h"

namespace Ui {
class MainWindow;
}

...
于 2013-01-25T08:23:46.013 回答
2

由于您在类中持有一个FileOperations对象,因此您需要完整的类声明。这意味着您必须包含标头,您不能像现在这样简单地转发声明该类。如果您只持有一个指针,并且在您的标头中没有任何尝试取消引用该指针的代码,那么前向声明就足够了。

编辑你有一个周期性的包含。您包括mainwindow.hfileoperations.h. 您可以通过完全删除该包含来修复。

于 2013-01-25T08:17:20.683 回答
1

您有循环包含问题,mainwindow.h 和 fileoperations.h 相互包含,请尝试从以下行中删除fileoperations.h

#include "mainwindow.h"
于 2013-01-25T08:25:47.173 回答