s
Там. 1, 2020, 11:28 Т.Қ.

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

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

2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

7
Evgenii Legotckoi
  • Там. 3, 2020, 3:09 Т.Қ.

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

    s
    • Там. 4, 2020, 3: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, 6: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, 3:07 Т.Қ.

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

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

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

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

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

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

            s
            • Там. 5, 2020, 11:38 Т.Қ.

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

              s
              • Там. 6, 2020, 11:11 Т.Ж.
              • Жауап шешім ретінде белгіленді.

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

                Пікірлер

                Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                Кіріңіз немесе Тіркеліңіз