s
silkroad1 августа 2020 г. 13:28

Ключевое слово class

Всем привет.
Решил так скажем переписать игру сапёр, нашёл на форумах архив 13ого года, и сейчас в ней разбираюсь, что да как и переношу всё к себе.
Дошёл до места где в главном файле sapper.cpp создаю экземпляры классов autorization и registration , что бы связать формы этих классов с главным окном и всё бы хорошо, но почему при объявлении мне обязательно нужно указать ключевое слово class??Стандартный синтаксис не предпологает такое вроде бы?
Тоесть , так не собираеться :
Registration registrationForm; //форма регистрации
Autorization
autorizationForm; //форма авторизации
а так собираеться :
class Registration registrationForm; //форма регистрации
class Autorization
autorizationForm; //форма авторизации
Спасибо.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
7

Добрый день.
Покажите код, где именно указываете class. Хотя это больше похоже на обычный Forward Declaration.

s
  • 4 августа 2020 г. 5:49
  • (ред.)
pragma once
include
include "ui_MySapper.h"
include "registration.h"
include "Autorization.h"
class MySapper : public QMainWindow
{
Q_OBJECT

public:
MySapper(QWidget *parent = Q_NULLPTR);

private:

Ui::MySapperClass ui;

class Registration * registrationForm;
class Autorization * autorizationForm;
static const int width = 10;
static const int height = 10;
static const int minMineCount = 10;
static const int maxAddMineCount = 5;

QString defaulInfo;

QTimer timer;
QTime mytime{ 0,0,0};

private slots:
void showRegistrationForm();
void autorization();
void startGame();
void secondGone();
};
  1. Используйте диалог вставки программного кода, чтобы разметка кода была, а не вот это, как получилось.
  2. Из этого кода могу сделать только один вывод. То, что находится в заголовочных файлах registration.h и Autorization.h не подключается и определённые в них классы не видятся.
s
  • 4 августа 2020 г. 16:50
  • (ред.)

Если закоментить include , то ошибка будет такая : C2027(использование неопределённого типа "Autorization").
Если убрать ключевое слово class , то ошибки будет 3 :

Ошибка C2143 синтаксическая ошибка: отсутствие ";" перед "*"(компилируется исходный файл Autorization.cpp) .
Ошибка C4430 отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию(компилируется исходный файл Autorization.cpp) .
Ошибка C2238 непредвиденные лексемы перед ";"(компилируется исходный файл Autorization.cpp) .

Тоесть файл он подключает, но почему мне нужно использовать слово class я не понимаю, кстати в исходниках, с которых я переписываю проект, тоже стоит слово class...

кстати в исходниках, с которых я переписываю проект, тоже стоит слово class...

Замечательный говнокод видимо там написан.

Если закоментить include , то ошибка будет такая : C2027(использование неопределённого типа "Autorization").

Логичное поведение, если убрать файл с объявлением класса

Ошибка C2143 синтаксическая ошибка: отсутствие ";" перед "*"(компилируется исходный файл Autorization.cpp) .
Ошибка C4430 отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию(компилируется исходный файл Autorization.cpp) .
Ошибка C2238 непредвиденные лексемы перед ";"(компилируется исходный файл Autorization.cpp) .

Ну у вас в файл Autorization.cpp некорректный код и битый синтаксис. Правьте Autorization.cpp, чтобы не было этих ошибок.

s

Забыл сообщить что класс Autorization и Registration так же использовали объект класса Sapper , поэтому и там и там был подключен #include Sapper.h
Когда я закомментировал строчку #include Sapper.h в обоих файлах, ошибка исчезла и я стал гуглить, что же это, нашёл про Взаимную зависимость и Предварительно объявление класса.
Но я всё равно не понимаю, почему предварительное объявление собираеться , а подключение через include нет, разве это не вопрос только в ускорении компиляции?

s
  • 6 августа 2020 г. 1:11
  • Ответ был помечен как решение.

Разобрался,на стаковерфлоу нашел топик и понял почему так происходило .

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
k
  • knobu
  • 23 сентября 2020 г. 2:34

C++ - Тест 006. Перечисления

  • Результат:60баллов,
  • Очки рейтинга-1
k
  • knobu
  • 23 сентября 2020 г. 2:21

C++ - Тест 005. Структуры и Классы

  • Результат:91баллов,
  • Очки рейтинга8
k
  • knobu
  • 23 сентября 2020 г. 2:16

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

QSqlTableModel выполняет ряд стандартных операций для одной таблицы из базы данных. Поэтому там и реализован функционал по удалению и редактированию. QSqlQueryModel позволяет выполнить запр…
VB

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

Добрый день. Хотел спросить вот что. Создал проект на основе QAbstractTableModel. В MainWindow cоответственно создал модель и связал с представлением. Поиск веду по списку элементов модели,…

QCheckBox в качестве делегата QTableView

До тех пор, пока у вас проект содержит только одну таблицу, или несколько то может быть. Когда их будет 1000 и чекбоксы в разных колонках, то без делегатов и переопределения возвращаемых ре…
D
  • Damir
  • 20 сентября 2020 г. 15:34

QCheckBox в качестве делегата QTableView

bool Node::setData(const QModelIndex& index, const QVariant& value, int role){ switch (index.column()) { case 0: switch (role) { case Qt::CheckStateRole:// <- т…
VB

Qt/C++ - Урок 004. QSqlTableModel или Как представить таблицу из БД в Qt?

Почему-то такой метод для обновления не работает, который можно было бы применить в данном примере. То есть в представлении данные удаляются и обновляются, а в базе данных изменений не происходи…
Сейчас обсуждают на форуме

Как в Qt в qmenu добавить scrollarea

Вот это наследованный класс меню. Но посути это обычное меню. #pragma once#include <QtWidgets>class TransMenu : public QMenu { Q_OBJECTpublic: TransMenu(QWidget* parent = …

Как в qml работать с динамически созданными потомками?

В QML есть сборщик мусора, он может удалять объекты не сразу а по ппрошествии времени. Попробуйте при удалении вызывать сборщик мусора принудительно через gc()
VB

Как запустить программу с базой данных PostgreSQL на другом компьютере

Не требует никакую библиотеку, запускается на других компьютерах, где не установлена PostgreSQL, но создать элемент невозможно, тем более отредактировать или удалить.
p
  • prod1s
  • 24 сентября 2020 г. 7:12

через QT не могу открыть файл SQLite

Вирішення знайшов. Вказав замість назви БД об'єкт класу QSqlDataBase для QSqlQuery. QSqlQuery m_query = QSqlQuery(qSqlDataBase); Після двох днів пошуку рішення, все-таки знайшов…
U

как скрыть елемент с копии виджета

Дело в том, что ui класса находится в private-секции... И из-вне доступ получить, не нарушая канонов - не получится) Можно конечно сделать что-то в духе #define private public, но это для истинн…
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB