s
1 августа 2020 г. 23:28

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

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

2

Вам это нравится? Поделитесь в социальных сетях!

7
Evgenii Legotckoi
  • 3 августа 2020 г. 15:09

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

    s
    • 4 августа 2020 г. 15:49
    • (ред.)
    1. pragma once
    2. include
    3. include "ui_MySapper.h"
    4. include "registration.h"
    5. include "Autorization.h"
    6. class MySapper : public QMainWindow
    7. {
    8. Q_OBJECT
    9.  
    10. public:
    11. MySapper(QWidget *parent = Q_NULLPTR);
    12.  
    13. private:
    14.  
    15. Ui::MySapperClass ui;
    16.  
    17. class Registration * registrationForm;
    18. class Autorization * autorizationForm;
    19. static const int width = 10;
    20. static const int height = 10;
    21. static const int minMineCount = 10;
    22. static const int maxAddMineCount = 5;
    23.  
    24. QString defaulInfo;
    25.  
    26. QTimer timer;
    27. QTime mytime{ 0,0,0};
    28.  
    29. private slots:
    30. void showRegistrationForm();
    31. void autorization();
    32. void startGame();
    33. void secondGone();
    34. };
      Evgenii Legotckoi
      • 4 августа 2020 г. 18:19
      1. Используйте диалог вставки программного кода, чтобы разметка кода была, а не вот это, как получилось.
      2. Из этого кода могу сделать только один вывод. То, что находится в заголовочных файлах registration.h и Autorization.h не подключается и определённые в них классы не видятся.
        s
        • 5 августа 2020 г. 2:50
        • (ред.)

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

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

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

          Evgenii Legotckoi
          • 5 августа 2020 г. 15:07

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

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

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

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

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

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

            s
            • 5 августа 2020 г. 23:38

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

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

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

                Комментарии

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