Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220

Правильное подключение хедеров

13.12.2014, 12:38. Показов 2709. Ответов 7

Студворк — интернет-сервис помощи студентам
Здоровеньки булы.
По совету DrOffset в теме Перекрёстное подключение заголовочных файлов попытался скомпоновать хедеры:

L_String.h:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#ifndef LIBRARY_STRINGS
#define LIBRARY_STRINGS
 
#include "L_Array.h"
 
namespace Library {
 
    namespace Special {
 
        template<typename CharType>
        class IString {
        protected:
            CharType* stringpoint;
            int lenght;
            inline void cstrcount(const CharType* ch) {
                while(*ch) {
                    ++lenght;
                    ++ch;
                }
            }
            inline void cstrcopy(const CharType* ch) {
                for(int i = 0; i < lenght; i++)
                    stringpoint[i] = ch[i];
                stringpoint[lenght] = 0;
            }
        public:
 
            IString();
            IString(const CharType* Cstr);
            IString(const CharType* Cstr, int Lenght);
            IString(const CharType* Cstr, int StartPos, int Lenght);
            IString(const IString<CharType>& Other);
            IString(IString<CharType>&& Other);
            IString(const Array<CharType>& Collect);
            ~IString() {
                delete[] stringpoint;
            }
 
            ...
 
        };
 
    }
 
    class String : public Special::IString<char> {
    public:
        String()
            : IString() {}
        String(const char* Cstr)
            : IString(Cstr) {}
        String(const char* Cstr, int Lenght)
            : IString(Cstr, Lenght) {}
        String(const char* Cstr, int StartPos, int Lenght)
            : IString(Cstr, StartPos, Lenght) {}
        String(const IString<char>& Other)
            : IString(Other) {}
        String(IString<char>&& Other)
            : IString(Other) {}
        String(const Array<char>& Collect)
            : IString(Collect) {}
        String ToUpper() const;
        String ToLower() const;
    };
 
 
 
    class StringW : public Special::IString<wchar_t> {
    public:
        StringW()
            : IString() {}
        StringW(const wchar_t* Cstr)
            : IString(Cstr) {}
        StringW(const wchar_t* Cstr, int Lenght)
            : IString(Cstr, Lenght) {}
        StringW(const wchar_t* Cstr, int StartPos, int Lenght)
            : IString(Cstr, StartPos, Lenght) {}
        StringW(const IString<wchar_t>& Other)
            : IString(Other) {}
        StringW(IString<wchar_t>&& Other)
            : IString(Other) {}
        StringW(const Array<wchar_t>& Collect)
            : IString(Collect) {}
        StringW ToUpper() const;
        StringW ToLower() const;
    };
 
};
 
#include "L_IString_realiz.h"
 
#endif
L_Errors.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef LIBRARY_ERRORS
#define LIBRARY_ERRORS
 
namespace Library {
 
    class Error {
        String message;
    public:
        Error()
            : message("Error") {}
        Error(const char* Message)
            : message(Message) {}
        Error(String Message)
            : message(Message) {}
        virtual ~Error() {}
        String Message() const {
            return message;
        }
    };
}
 
#endif
L_IString_realiz.h:
C++
1
2
3
4
5
6
7
8
9
10
#include "L_Errors.h"
 
namespace Library {
 
    namespace Special {
 
        //реализация
    }
 
};
Однако vs ссыплет ошибками в L_Errors.h и класс String не признаёт.
Изначальная суть проблемы: необходимо собрать классы, каждый из которых должен знать и может создавать другой.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2014, 12:38
Ответы с готовыми решениями:

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

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

Правильное подключение .h и .cpp файлов
Доброго времени уважаемые форумчане. Я совсем зеленый в плюсах, не бейте пожалуйста сильно. Делаю программу которая выдает разные...

7
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
13.12.2014, 12:56
1. Я не вижу описание класса String.
Есть IString.
2. Поскольку класс шаблонный, то его реализацию нельзя выносить в отдельный файл.
Все пишите в заголовочном.
0
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
13.12.2014, 12:59  [ТС]
В L_String.h 45 строка class String : public Special::IString<char>
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
13.12.2014, 14:26
Бендерродригез, ошибки-то хоть покажи
А еще лучше давай все свои файлы в архиве. Гадать что-то не хочется.

Безотносительно данной проблемы, создавать класс, который может кидать исключения, содержащие тот же самый класс - это очень плохо. Можно напороться на бесконечный выброс исключения.
0
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
13.12.2014, 14:48  [ТС]
Ошибки и солюшн.
Миниатюры
Правильное подключение хедеров  
Вложения
Тип файла: 7z TNO_Library.7z (5.79 Мб, 3 просмотров)
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
13.12.2014, 15:16
Лучший ответ Сообщение было отмечено Бендерродригез как решение

Решение

Бендерродригез, у тебя в самом верху подключается Array.h, а он в свою очередь подключает Errors.h. Т.е. Errors.h подключается одним из первых. А Errors.h требует определение класса String, которого нет. Вот и ошибка. Нужно перенести определение методов из Array.h таким образом, чтобы они видели полное определение класса String.

В связи с тем, что все это шаблоны, подключение становится все более нетривиальным и ошибкоопасным. Что будет когда количество файлов возрастет, скажем, до 10... Поэтому самое нормальное решение, которое я могу посоветовать в этой ситуации - отказаться от класса String в качестве хранилища текста ошибки в исключении.

Добавлено через 10 минут
Бендерродригез, помимо этого там еще есть ошибки не связанные с подключением.
ошибка раз:
C++
1
Array(int N, Type T = T()); // это что? наверное имелось в виду Type T = Type()
ошибка два:
C++
1
2
3
Array(int N, Type T = T()) {
    arr = new[] Type(T); // это как понимать? Какого размера тут будет массив?
}
ошибка три:
C++
1
2
3
4
InvalidIntArgument(int N, char * mes = "Int value is invaled.") // не хватает const у char*
    : Error(mes), value(N), numberofargument(0) {}
InvalidIntArgument(int N, int ArgN, char * mes = "Int value is invaled.") // не хватает const у char*
    : Error(mes), value(N), numberofargument(ArgN) {}
Добавлено через 4 минуты
ошибка четыре:
В классе Array не реализован чистовиртуальный метод Size, хотя объект типа Array<> в паре мест возвращается по значению.
1
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
13.12.2014, 15:19  [ТС]
Array был написан просто как затычка, на скорую руку, но за замечания спасибо.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
13.12.2014, 15:21
Бендерродригез, Приложил исправления, которые нашел.
Вложения
Тип файла: 7z src.7z (2.7 Кб, 6 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.12.2014, 15:21
Помогаю со студенческими работами здесь

Порядок Хедеров
Добрый день, подскажите, как правильно подключать хедеры если имеются, несколько классов, которые использую друг друга. А именно(все...

Компоновка хедеров
Собственно вот такая проблема. Есть два файла first.h; second.h; каждый из них #include &quot;vector.h&quot;; И есть ещё файл...

Циклическое подключение хедеров
Добрый день. Проблема такая: есть два хедера // Unit1.h #ifndef Unit1H #define Unit1H #include &quot;Unit2.h&quot; class c1 ...

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

Правильное подключение
Скажите как правильно подключить или записать так что бы после выбора mdb файла в ADO через OpenDialog ADOConnection был в true..... не...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных выбран регистр накопления, в. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru