76 / 4 / 0
Регистрация: 26.10.2018
Сообщений: 79
1

Ошибки подключения заголовочных файлов

06.04.2020, 19:06. Показов 1063. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую, во время написания кода возникли ошибки, которые пробовал решить по разному, но не вышло.

Файл main:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <windows.h>
#include <conio.h>
#include "DosSystem.cpp"
#include "Display.cpp"
#include <string>
 
using namespace std;
using namespace dos;
using namespace display;
 
static HANDLE conHandle = GetStdHandle(STD_OUTPUT_HANDLE); // Переменная хранящая HANDLE консоли
static COORD coord; // Переменная хранящая координаты для курсора
 
int main()
{
    DosSystem* doss = new DosSystem();
    Display* display = new Display();
 
    char symbol; // Переменная хранящая код нажатой клавиши
    display->Fullscreen();
 
    while (true) { // Выполнение действий пока программа работает
        symbol = _getch(); // Нажатие клавиши
      
        switch (symbol) { // Проверка какая клавиша нажата
        case 27: // Если нажата клавиша Escape, то выход из программы
            exit(1); // Выход из программы
        case 72: // Если нажата Стрелка Вверх, то вывод строки Up
            system("cls"); // Отчистка экрана
            SetConsoleCursorPosition(conHandle, coord); // Установка позиции курсора в координаты указанные в переменной coord 
            cout << "Up" << endl; // Вывод строки Up
            break; // Завершение действий
        case 75: // Если нажата Стрелка Влево, то вывод строки Left
            system("cls"); // Отчистка экрана
            SetConsoleCursorPosition(conHandle, coord); // Установка позиции курсора в координаты указанные в переменной coord
            cout << "Left" << endl; // Вывод строки Left
            break; // Завершение действий
        case 77: // Если нажата Стрелка Вправо, то вывод строки Right
            system("cls"); // Отчистка экрана
            SetConsoleCursorPosition(conHandle, coord); // Установка позиции курсора в координаты указанные в переменной coord
            cout << "Right" << endl; // Вывод строки Right
            break; // Завершение действий
        case 80: // Если нажата Стрелка Вниз, то вывод строки Down
            system("cls"); // Отчистка экрана
            display->setCursorPos(conHandle, coord);//SetConsoleCursorPosition(conHandle, coord); // Установка позиции курсора в координаты указанные в переменной coord
            cout << "Down" << endl; // Вывод строки Down
            break; // Завершение действий
        default: // Если никакая клавиша из проверяемых не нажата, то повторно проверяется нажатие
            break; // Завершение действий
        }
    }
    return 0;
}
Файл Display.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <windows.h>
#include "Display.h"
 
using namespace display;
 
void Display::Fullscreen() {
    SetConsoleDisplayMode(GetStdHandle(STD_OUTPUT_HANDLE), CONSOLE_FULLSCREEN_MODE, 0);
}
 
void Display::setCursorPos(HANDLE hCon, COORD coord) {
    SetConsoleCursorPosition(hCon, coord);
}
Файл Display.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <windows.h>
 
#ifndef __DISPLAY_H
#define __DISPLAY_H
namespace display {
    class Display {
    public:
        static void Fullscreen();
        static void setCursorPos(HANDLE hCon, COORD coord);
    };
}
#endif //__DISPLAY_H
Файл DosSystem.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "DosSystem.h"
#include <windows.h>
 
using namespace std;
using namespace dos;
 
HANDLE DosSystem::getConsoleHandle() {
    HANDLE conHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    return conHandle;
}
 
COORD DosSystem::setCursorCoord(int x, int y) {
    COORD coord;
    coord.X = x;
    coord.Y = y;
    return coord;
}
Файл DosSystem.h
C++
1
2
3
4
5
6
7
8
9
10
#ifndef __DOSSYSTEM_H
#define __DOSSYSTEM_H
namespace dos {
    class DosSystem {
    public:
        static HANDLE getConsoleHandle();
        static COORD setCursorCoord(int x, int y);
    };
}
#endif //__DOSSYSTEM_H
Вот ошибки: 1) getConsoleHandle: неизвестный спецификатор переопределения 2) getConsoleHandle: не является членом "dos:osSystem" 3) setCursorCoord: не является членом "dos:osSystem" 4) тип "int" не требуется - это в setCursorCoord...
Вряд ли все дело в создании заголовочных файлов и в последующем реализации объявленных в них методов... Я на линуксе так в другой задаче уже делал и все работало

P.S. Вместо улыбающихся смайлов было : и D... Проще говоря namespace dos, а класс DosSystem
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2020, 19:06
Ответы с готовыми решениями:

Универсальный способ подключения заголовочных файлов, или как мне не ловить цикличное обьявление каждую компиляцию?
Я сейчас на пути создания игры, которая заполонит весь мир - в нее будут играть все, делать...

Про добавление заголовочных файлов в заголовочных файлах
В который раз эта вещь засовывает мозги в блендер! Я про то, что не могу однозначно запомнить...

Раздельная компиляция (нюансы использования заголовочных файлов и файлов реализации)
Почему во многих учебниках функции-члены класса внутри класса только объявляют, но определяют вне...

Подключение заголовочных файлов и файлов реализации
Здравствуйте,при создании класса в visual studio руками не компилится проект,при создании через add...

4
Вездепух
Эксперт CЭксперт С++
11688 / 6367 / 1723
Регистрация: 18.10.2014
Сообщений: 16,050
06.04.2020, 19:19 2
Цитата Сообщение от ILUNCHIK Посмотреть сообщение
Вряд ли все дело в создании заголовочных файлов
Так а что это у вас за странная манера включения заголовочных файлов?

DosSystem.h у вас зависит от <windows.h>, но не включает <windows.h>. Если вам так нравится - то пожалуйста. Но это значит, что в файлах реализации вы должны не забывать обязательно включать <windows.h> и включать его обязательно перед DosSystem.h.

А у вас в DosSystem.cpp

C++
1
2
#include "DosSystem.h"
#include <windows.h>
Разумеется, это не будет компилироваться.

---

Я смотрю вы не против того, чтобы включать одни заголовочные файлы в другие (см. Display.h). Тогда почему <windows.h> у вас не включен в DosSystem.h? Просто включите его туда и забудьте об этих особенностях порядка включения.

Также непонятно, почему вы выносите директивы #include за пределы include guards (см. Display.h).

---

А это еще что за ужас в main

C++
1
2
#include "DosSystem.cpp"
#include "Display.cpp"
?

Зачем вы включаете .cpp файлы???
0
76 / 4 / 0
Регистрация: 26.10.2018
Сообщений: 79
07.04.2020, 06:50  [ТС] 3
TheCalligrapher, 1) По поводу подключения cpp файлов... А как по другому? .h не подключишь, потому что там только объявление и в дальнейшем в cpp файле, то есть в файле реализации подключается заголовочный.
2) От вашего совета легче не стало. Пишет, что все мои функции уже определены в main файле(ConsoleApplication1.cpp)
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
07.04.2020, 07:27 4
Цитата Сообщение от ILUNCHIK Посмотреть сообщение
2) getConsoleHandle: не является членом "dos:osSystem" 3) setCursorCoord: не является членом "dos:osSystem"
хм, я обычно задавала get и set в .h - там где и класс dos:osSystem в вашем случае... зачем его в .cpp выносите?.. не уверена, что ошибка в этом... но по логике - мне не понятно ваше разделение по файлам...

Добавлено через 6 минут
Цитата Сообщение от ILUNCHIK Посмотреть сообщение
Пишет, что все мои функции уже определены в main файле(ConsoleApplication1.cpp)
так они вроде и определены
Цитата Сообщение от ILUNCHIK Посмотреть сообщение
DosSystem* doss = new DosSystem();
Display* display = new Display();
из .h должны быть заданы...
? может компилятор ваш .cpp (который мне не нравится) - снова компайлит ?

Добавлено через 11 минут
Цитата Сообщение от ILUNCHIK Посмотреть сообщение
.h не подключишь, потому что там только объявление
так его и подключайте, а в .cpp уже указано, что методы от класса в .h - "класс::метод"...
а .cpp компилятор вроде сам все cpp видит и сам все cpp компилирует - ему подсказывать не надо... может из-за этого включения и говорит, что "уже ведь 2-й раз определяете"... имхо
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
08.04.2020, 19:11 5
вот, может, поможет
Programs with multiple code files
0
08.04.2020, 19:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2020, 19:11
Помогаю со студенческими работами здесь

Подключение заголовочных файлов
Как работает подключение заголовчных файлов в Линукс во время компиляции? К примеру имею свой...

Подключение заголовочных файлов
Итересует меня вопрос : нужно ли при компиляции программ оставлять только нужные хэдеры ? т.е. их...

Назначение заголовочных файлов
Я читала учебник и википедию - никак не доходит. В общем, может я неправильно поняла: есть у...

Подключение заголовочных файлов
Здравствуйте. Возникают ошибки при компиляции проекта: 1. Указывает на указатель: 2. Указывает...

Отличие заголовочных файлов
чем отличается string.h cstring string

Подключение заголовочных файлов.
У меня есть заголовочный файл: ...\1\2\file.h. в папке &quot;1&quot; есть file2.h. Как подключить к &quot;file.h&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru