2013-01-25 37 views
0

我做错了什么?Qt和C++类给我一个错误

#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 FileController;'它让我编译一次程序(并且它工作正常),然后在下次尝试编译时出错。

我正在使用Qt 5.0。

fileoperations.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 
+2

'fileoperations.h'怎么样? –

+0

刚刚发布:) – killerloader

回答

2

既然你拿在类FileOperations对象,你需要完整的类声明。这意味着你必须包含标题,你不能简单地像现在所做的那样简单地向前宣布类。如果只保存一个指针,并且在头中没有任何试图解引用指针的代码,则前向声明就足够了。

编辑你有一个周期性的包括。您在fileoperations.h中包含mainwindow.h。如果删除完全包含的内容,则可以修复。

+3

但是'fileoperations.h' **是**包括在内? –

+0

@Andreas好吧,'fileoperations.h'是否有类声明?如果是这样,OP应该说明它。它可能已经坏了。 – juanchopanza

+0

在那里,我把fileoperations.h类放入。 – killerloader

3

我认为,在你的.cpp文件,您使用的

#include "fileoperations.h" 

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

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

namespace Ui { 
class MainWindow; 
} 

... 
1

您已经圆形包括问题,mainwindow.h和fileoperations.h包括对方,尝试从下面的行中删除fileoperations.h

#include "mainwindow.h"