kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 IsabellaW
IsabellaW
Вопрос

"Поле имеет неполный тип" ошибка

В моем заголовочном файле есть ошибка:

field "ui" has incomplete type.

Я пробовал сделать ui указателем, но это не работает. Я не думаю, что мне нужно это делать, потому что я уже определил свой MainWindowClass в пространстве имен Ui. Это мой 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
70 2012-09-17T19:41:13+00:00 2
Cristian Ciupitu
Cristian Ciupitu
Редактировал вопрос 12-го мая 2014 в 1:41
Программирование
c++
Ed S.
Ed S.
17-го сентября 2012 в 7:54
2012-09-17T19:54:31+00:00
Дополнительно
Источник
Редактировать
#17230238

Вы используете прямое объявление для типа MainWindowClass. Это прекрасно, но это также означает, что вы можете объявить только указатель или ссылку на этот тип. В противном случае компилятор не имеет понятия, как выделить родительский объект, поскольку он не знает размер объявленного вперед типа (или есть ли у него конструктор без параметров и т.д.).

Итак, вы либо хотите:

// forward declaration, details unknown
class A;

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

Или, если вы не можете использовать указатель или ссылку....

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

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

В какой-то момент компилятору нужно узнать подробности A.

Если вы храните только указатель на A, то ему не нужны эти подробности, когда вы объявляете B. Они понадобятся в какой-то момент (когда вы действительно разыменуете указатель на A), который, скорее всего, будет в файле реализации, куда вам нужно будет включить заголовок, содержащий объявление класса 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();
}
Ed S.
Ed S.
Редактировал ответ 17-го сентября 2012 в 8:02
93
0
 Macmade
Macmade
17-го сентября 2012 в 7:44
2012-09-17T19:44:32+00:00
Дополнительно
Источник
Редактировать
#17230237

Проблема в том, что ваше свойство ui использует переднее объявление класса Ui::MainWindowClass, отсюда и ошибка "неполного типа".

Включение заголовочного файла, в котором объявлен этот класс, устранит проблему.

EDIT

Основываясь на вашем комментарии, следующий код:

namespace Ui
{
    class MainWindowClass;
}

не НЕ объявляет класс. Это переднее объявление, означающее, что класс будет существовать в какой-то момент, во время соединения.
По сути, это просто говорит компилятору, что тип будет существовать, и что он не должен предупреждать об этом.

Но класс должен быть где-то определен.

Обратите внимание, что это может работать, только если у вас есть указатель на такой тип.
Вы не можете иметь статически выделенный экземпляр неполного типа.

Так что либо вам действительно нужен неполный тип, и тогда вы должны объявить член ui как указатель:

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;
};

Либо вы хотите статически выделенный экземпляр Ui::MainWindowClass, и тогда его нужно объявить. Вы можете сделать это в другом заголовочном файле (обычно на класс приходится один заголовочный файл).
Но просто измените код на:

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;
};

тоже сработает.

Обратите внимание на разницу между двумя объявлениями. Первое использует прямое объявление, а второе фактически объявляет класс (здесь нет ни свойств, ни методов).

 Macmade
Macmade
Редактировал ответ 17-го сентября 2012 в 8:07
15
0
Похожие сообщества 9
pro.cxx
pro.cxx
5 960 пользователей
C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. No Ads, offtop, flood 2. Полные правила тут https://t.me/ProCxx/259155 Объявления о вакансиях,эвентах - в лс @AlexFails или @MasterZiV
Открыть telegram
supapro.cxx
supapro.cxx
4 991 пользователей
Чат для тех, кто немного знает C++, простые вопросы по C++, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат-флудилка — @fludpac /прогерские вопросы – @pro_prog 🚫flood, pron, spam; ✅УВАЖАЙТЕ ДРУГ ДРУГА!
Открыть telegram
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
1 393 пользователей
Лекции: www.youtube.com/playlist?list=PLRDzFCPr95fL_5Xvnufpwj2uYZnZBBnsr Практика: cs.mipt.ru/cpp_algo Спонсировать: www.paypal.me/tkhirianov Онлайн компилятор https://godbolt.org
Открыть telegram
Чат конференции C++ Russia
Чат конференции C++ Russia
1 205 пользователей
Канал конференции: @cpprussia_channel Ближайшая конференция — C++ Russia 2023, 11–12 мая · Online Оффлайн — 23–24 мая · Москва Билеты: https://tinyurl.com/CPPRussia2023 Саппорт: @JUGConfSupport_bot
Открыть telegram
Android NDK (C++) — русскоговорящее сообщество
Android NDK (C++) — русскоговорящее сообщество
790 пользователей
Общаемся на темы, посвященным Android-разработке на C++. Обмен новостями, опытом и наработками. + Про Android: @android_ru + Про iOS: @ios_ru + Канал Android: @pandroidtoday_ru + Вакансии: @mobile_jobs Рекомендуем отключить уведомления.
Открыть telegram
C++ для самых маленьких и отчаяных
C++ для самых маленьких и отчаяных
564 пользователей
Лоу левел (по среднему IQ участников) чатик По продвижению вакансий писать @vertver Флудилка чата - @hckcxx
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 1 день назад
2
Денис Васьков
Зарегистрирован 2 дня назад
3
Dima Patrushev
Зарегистрирован 5 дней назад
4
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
5
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
ES
ID
JA
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией