"Lapangan telah lengkap type" kesalahan

Ada kesalahan di file header:

field "ui" has incomplete type.

Saya telah mencoba membuat ui pointer, tapi itu doesn't bekerja. Saya don't pikir saya harus melakukan itu karena aku sudah ditentukan saya MainWindowClass dalam namespace Ui. Ini adalah saya mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include "ui_mainwindow.h"

namespace Ui {
    class MainWindowClass;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

    public:
        MainWindow(QWidget *parent = 0, Qt::WFlags flags=0);
        ~MainWindow();

    public slots:
        void slideValue(int);
    private:
        Ui::MainWindowClass ui; //error line
};

#endif // MAINWINDOW_H
Mengomentari pertanyaan (1)

Anda menggunakan deklarasi maju untuk jenis MainWindowClass. Yang's baik-baik saja, tapi itu juga berarti bahwa anda hanya dapat mendeklarasikan sebuah pointer atau referensi untuk jenis itu. Jika compiler tidak memiliki ide bagaimana untuk mengalokasikan objek induk seperti itu doesn't tahu ukuran maju menyatakan jenis (atau jika itu benar-benar memiliki parameterless konstruktor, dll.)

Jadi, anda ingin:

// forward declaration, details unknown
class A;

class B {
  A *a;  // pointer to A, ok
};

Atau, jika anda bisa't menggunakan pointer atau referensi....

// declaration of A
#include "A.h"

class B {
  A a;  // ok, declaration of A is known
};

Di beberapa titik, compiler perlu tahu rincian dari A.

Jika anda hanya menyimpan pointer ke A maka itu doesn't perlu detail-detail ketika anda mendeklarasikan B. Kebutuhan mereka di beberapa titik (setiap kali anda benar-benar pointer dereference untuk A), yang kemungkinan akan di implementasi file, di mana anda akan perlu untuk memasukkan header yang berisi deklarasi kelas A.

// B.h
// header file

// forward declaration, details unknown
class A;

class B {
public: 
    void foo();
private:
  A *a;  // pointer to A, ok
};

// B.cpp
// implementation file

#include "B.h"
#include "A.h"  // declaration of A

B::foo() {
    // here we need to know the declaration of A
    a->whatever();
}
Komentar (1)

Masalahnya adalah bahwa anda ui properti menggunakan maju deklarasi kelas Ui::MainWindowClass, maka "tidak lengkap type" kesalahan.

Termasuk file header di mana kelas ini menyatakan akan memperbaiki masalah.

EDIT

Berdasarkan komentar anda, kode berikut:

namespace Ui
{
    class MainWindowClass;
}

tidak TIDAK menyatakan sebuah kelas. It's a maju deklarasi, yang berarti bahwa kelas akan ada di beberapa titik, di link waktu.
Pada dasarnya, itu hanya memberitahu compiler bahwa jenis akan ada, dan bahwa hal itu tidak't memperingatkan tentang hal itu.

Tapi kelas harus didefinisikan suatu tempat.

Catatan ini hanya bisa bekerja jika anda memiliki pointer seperti jenis.
Anda dapat't memiliki statis dialokasikan contoh lengkap jenis.

Jadi baik anda benar-benar ingin tipe yang tidak lengkap, dan kemudian anda harus menyatakan ui anggota sebagai pointer:

namespace Ui
{
    // Forward declaration - Class will have to exist at link time
    class MainWindowClass;
}

class MainWindow : public QMainWindow
{
    private:

        // Member needs to be a pointer, as it's an incomplete type
        Ui::MainWindowClass * ui;
};

Atau anda ingin statis dialokasikan contoh dari Ui::MainWindowClass, dan kemudian itu harus dinyatakan. Anda bisa melakukannya di lain file header (biasanya, ada's satu file header per kelas).
Tapi hanya mengubah kode ke:

namespace Ui
{
    // Real class declaration - May/Should be in a specific header file
    class MainWindowClass
    {};
}

class MainWindow : public QMainWindow
{
    private:

        // Member can be statically allocated, as the type is complete
        Ui::MainWindowClass ui;
};

juga akan bekerja.

Perhatikan perbedaan antara dua deklarasi. Pertama menggunakan deklarasi maju, sementara yang kedua benar-benar menyatakan kelas (di sini dengan tidak ada sifat atau metode).

Komentar (7)