Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152

Ошибка в заголовочном файле

03.04.2019, 16:08. Показов 1988. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

У меня есть два заголовочных файла и в одном из них у меня возникла проблема

Проблемный файл

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef SKOBKA_SEACH_H_INCLUDED
#define SKOBKA_SEACH_H_INCLUDED
#include<string>
 
class Seach_skobka
{
    public:
        Seach_skobka();
        int[] get_skobka(); // Ошибка expected unqualified-id before '[' token
    private:
        char type_skobka;
        int index_nach;
        string formula;
        char skobka[] = {'(', '['};
        int seach_koif(int end_index);
    protected:
        int seach_skobka_end(int index, char type_skobka);
};
#endif // SKOBKA_SEACH_H_INCLUDED
Сначала подумал что я неправильно объявил функцию, которая возвращает массив целых чисел, но в другом файле подобной ошибки не возникает, возможно я невнимателен.

В этом заголовке проблем нет

C++ (Qt)
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
#ifndef ENUMERATION_H_INCLUDED
#define ENUMERATION_H_INCLUDED
#include <string>
#include "skobka_seach.h"
 
struct Massiv
{
    int border[2]; // Начальный и конечный индекс скобки
    int koif; // Коэффициент скобки
};
struct Ion_info
{
    int nach_index_in_formul; // Начальный индекс иона в формуле
    int end_index_in_formul; // Конечный индекс иона в формуле
    int koif; // Коэффициент иона
    string ion; // Сам ион
};
class Enumeration : public Seach_skobka
{
    public:
        Enumeration(string formul);
        list<Ion_info> get_elements_list();
    private:
        string formula;
        list<Ion_info> Info_ion_list;
        list<Massiv> Skobka_list;
        char skobka[] = {'(', '['};
        void enumeration();
        string seach_ion(int index, string ions[]);
        string[] massiv(string ions_arraive); // Здесь функция тоже возвращает массив, но ошибки нет 
        list<Ion_info> fixed_koif();
};
#endif // ENUMERATION_H_INCLUDED
Помогите найти ошибку, заранее спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2019, 16:08
Ответы с готовыми решениями:

Ошибка при объявлении функции в заголовочном файле
Здравствуйте! Я пытаюсь в заголовочном файле объявить вот такой метод: test.h #include &lt;string&gt; #include...

Как завести вектор и структуру глобально в заголовочном файле или в чем ошибка
Создал заголовочный файл Globals.h. В нем объявляется структура и вектор из структур. #ifndef _Globals_ #define _Globals_ #include...

Структура в заголовочном файле
Код .h: // file.h #pragma once struct Worker { char name; int cdate; int vdate; char post;

20
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
03.04.2019, 16:13
Цитата Сообщение от Danil_2002 Посмотреть сообщение
C++
1
int[] get_skobka();
Цитата Сообщение от Danil_2002 Посмотреть сообщение
что я неправильно объявил функцию, которая возвращает массив целых чисел
Ех..
А с чего вдруг вы решили что так делать можно?
Дам подсказку, так делать нельзя.
В С++ нельзя возвратить массив по значению, можно только ссылку или указатель.
В вашем случае Вы возвращаете, указатель на первый элемент массива.
Если бы читали книжки, знали бы это.
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
03.04.2019, 16:15  [ТС]
Хотя эти файлы оба проблемные, только сейчас заметил что h файл, в котором проблемы, используется в моей программе первым
поэтому и ошибка только в нем.

Тогда как правильно объявить функцию в заголовочном файле, которая возвращает массив?

Добавлено через 56 секунд
Просто я раньше C# изучал, там можно было так
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
03.04.2019, 16:33
Цитата Сообщение от Danil_2002 Посмотреть сообщение
C++
1
// Здесь функция тоже возвращает массив, но ошибки нет
Нет, не возвращает.
string[] будет неявно превращен в string*.
А это
Цитата Сообщение от Azazel-San Посмотреть сообщение
указатель на первый элемент массива
Добавлено через 1 минуту
Цитата Сообщение от Danil_2002 Посмотреть сообщение
как правильно объявить функцию в заголовочном файле, которая возвращает массив?
Еще раз
Цитата Сообщение от Azazel-San Посмотреть сообщение
В С++ нельзя возвратить массив по значению, можно только ссылку или указатель.
Т.е. ссылку на массив или указатель на массив.

Добавлено через 7 минут
Цитата Сообщение от Danil_2002 Посмотреть сообщение
Тогда как правильно объявить функцию в заголовочном файле, которая возвращает массив?
Советую делать это по ссылке:
C++
1
2
3
4
5
6
7
struct dummy {
    int array_[10]{};
 
    auto const& get() const {
        return array_;
    }
};
Добавлено через 8 минут
Цитата Сообщение от Danil_2002 Посмотреть сообщение
Просто я раньше C# изучал, там можно было так
На шарпе, там все обертки, если смотреть с такого ключа, то можно сделать так
C++
1
2
3
4
5
6
7
#include <array>
 
struct dummy {
    std::array<int, 10> arr_;
 
    std::array<int, 10> get() const { return arr_; }
};
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
03.04.2019, 16:34  [ТС]
Спасибо, большое!
0
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
04.04.2019, 10:42  [ТС]
Я разобрался с массивами, все понятно. Но при изучении .h фалов дальше опять возникают непонятки. Некоторые пишут что хидеры используются для согласование, другие... ну вообщем я решил написать небольшой пример в качестве наглядного примера и уже дальше разбираться, но возникла ошибка. Прочитал как происходит компиляция программ, но ответ на свою проблему так и не нашел.

есть файл main.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include "Enumeration.h"
 
using namespace std;
 
int main()
{
    int value = get_value(); // undefined reference to get_value
    cout << value << endl;
    return 0;
}
файл Enumeration.cpp:
C++ (Qt)
1
2
3
4
int get_value()
{
    return 10;
}
и Enumeration.h, в котором прототип функции :
C++ (Qt)
1
2
3
4
5
6
#ifndef ENUMERATION_H_INCLUDED
#define ENUMERATION_H_INCLUDED
 
int get_value();
 
#endif // ENUMERATION_H_INCLUDED
Все эти файлы в одной директории.

Как я понимаю компилятор не находит реализацию этого метода или что то в этом роде.

Что нужно исправить в моей программе чтобы все заработало?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
04.04.2019, 10:45
Цитата Сообщение от Danil_2002 Посмотреть сообщение
файл Enumeration.cpp:
Добавить подключение заголовка.
C++
1
2
3
4
5
#include "Enumeration.h"
int get_value()
{
    return 10;
}
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
04.04.2019, 10:54  [ТС]
не помогло

Добавлено через 6 минут
у меня кстати enumeration.h в (дереве файлов или workspace как это назвать правильно)подсвечивается бледно серым, а остальные файлы .срр черным. Может из-за этого?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
04.04.2019, 11:19
Цитата Сообщение от Danil_2002 Посмотреть сообщение
не помогло
Что значит не помогло..
Какие ошибки выдает?
Вы путь то верный прописали к заголовку?
Может у вас должно быть так:
C++
1
2
3
4
5
#include "headers/Enumeration.h" // где находится ваш заголовок? Мб в папке какой?
int get_value()
{
    return 10;
}
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
04.04.2019, 13:35  [ТС]
Ошибка такая же. хидер лежит в папке на рабочем столе со всеми остальными файлами проекта срр.

Путь к файлу такой если надо:C:\Users\bymi1\OneDrive\Рабочий стол\Данил\Разработка\C++\Nicolas-0.0.0\Enumeration.h
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
04.04.2019, 13:41
Цитата Сообщение от Danil_2002 Посмотреть сообщение
Ошибка такая же. хидер лежит в папке на рабочем столе со всеми остальными файлами проекта срр.
Т.е. Enumeration.h лежит там же где и Enumeration.cpp и main.cpp?
Окей, тогда какая у вас среда (IDE/компилятор), какая ОС и как вы собираете проект?
Попробуйте сделать rebuild вашего проекта, или сначала сделать clean/clean solution и только потом сделать build.
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
04.04.2019, 13:50  [ТС]
IDE codebloks, OC Windows 10, GNU Compiler. Собираю проект просто нажав желтую шестеренку в Codebloks)

Добавлено через 3 минуты
mingw32++
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
04.04.2019, 13:57
Цитата Сообщение от Danil_2002 Посмотреть сообщение
у меня кстати enumeration.h в (дереве файлов или workspace как это назвать правильно)подсвечивается бледно серым, а остальные файлы .срр черным. Может из-за этого?
Теперь можно вернутся сюда.
Вы уверенны что у вас все зависимости видимы?
Ниразу не работал в КодБлоксе, не знаю как их там верно добавлять в проект.
Цитата Сообщение от Danil_2002 Посмотреть сообщение
Собираю проект просто нажав желтую шестеренку в Codebloks)
После проверки, что у вас верно проставлены все зависимости и они видимы в проекте.
Попробуйте сделать
Цитата Сообщение от Azazel-San Посмотреть сообщение
rebuild вашего проекта, или сначала сделать clean/clean solution и только потом сделать build.
Добавлено через 2 минуты
Danil_2002, вот здесь (скрольте где-то в середину, хотя лучше прочитайте статью целиком) есть пример как это верно сделать.
Просмотрите что бы у вас было как в статье выше.
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
04.04.2019, 14:06  [ТС]
но я прям в codebloks создавал файл: file-> new->file и дальше указывал имя файла и т.д. поэтому по идее проблем с зависимостями быть не должно
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
04.04.2019, 14:09
Цитата Сообщение от Danil_2002 Посмотреть сообщение
по идее проблем с зависимостями быть не должно
Но ведь она есть.
Проблема где-то в провтыке или надо просто пересобрать проект (в любом случае я считаю это надо объязательно проделать).
Прочтите статью что я скидывал вам, убедитесь на 100% что все ок.
А потом сделайте ребилд.
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
04.04.2019, 14:31  [ТС]
Вроде заработало, но пришлось почему создавать пустой проект и все мои файлы кидать туда, так все компилируется.
Довольно странно, но хоть так.
Спасибо за статью!
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
04.04.2019, 14:35
Цитата Сообщение от Danil_2002 Посмотреть сообщение
Довольно странно, но хоть так.
Да, проблема в том что каждая IDE, делает это немного по своему.
И надо соответствовать ее требованиям.
Как видите если что-то не понравится ей, будете получать ошибку.
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
05.04.2019, 09:53  [ТС]
Я сегодня разобрался (частично со своей проблемой). Оказывается в codeblocks после того как ты создал файл уже в проекте его нужно еще и добавить в проект в ручную). После разработки в visual studio на C# о таком даже подумать не мог, там как то все более автономно было.

Но на смену одной проблеме приходит другая. В C# хорошим тоном было выносить каждый класс в отдельный файл и я решил также делать и в C++. И вот:

файл main.cpp:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include "enumeration.h"
using namespace std;
 
int main()
{
    Enumeration enumer; 
    int value = enumer.ret();  // ОШИБКА undefined reference to Enumeration::ret()
    cout << value << endl;
}
файл enumeration.cpp:

C++ (Qt)
1
2
3
4
5
6
7
8
class Enumeration
{
    public:
        int ret()
        {
            return 10;
        }
};
файл enumeration.h:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
#ifndef ENUMERATION_H_INCLUDED
#define ENUMERATION_H_INCLUDED
 
class Enumeration
{
    public:
        int ret();
};
 
#endif // ENUMERATION_H_INCLUDED
Но если я убираю класс и просто создаю метод ret(), и его вызываю из main, то все норм. Значит проблема не в зависимостях,
а в том что я просто не правильно что то в коде написал.

Что именно ?) И вообще правильно ли выносить каждый класс в отдельный файл в C++?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
05.04.2019, 10:04
Цитата Сообщение от Danil_2002 Посмотреть сообщение
файл enumeration.cpp:
Тут подключи enumeration.h, и оставь только реализацию метода класса, не нужно опять класс определять.

Добавлено через 2 минуты
Цитата Сообщение от Danil_2002 Посмотреть сообщение
файл enumeration.cpp:
C++
1
2
3
4
5
6
#include "enumeration.h"
 
int Enumeration::ret()
{
     return 10;
}
1
 Аватар для Danil_2002
35 / 25 / 10
Регистрация: 16.02.2018
Сообщений: 152
05.04.2019, 10:07  [ТС]
Понял, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2019, 10:07
Помогаю со студенческими работами здесь

Функции в заголовочном файле
Почему нельза задать тело функции в .h файле??? например(header.h): #ifndef HEADER_H #define HEADER_H void f(){} #endif //...

С - С++ enum в заголовочном файле
ситуация примерно такая компилятор gcc есть заголовочный файл в нем определен список enum этот заголовочный файл инклудится...

Setlocale в заголовочном файле
main.cpp #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;string&gt; #include &quot;studio.h&quot; using namespace...

Переменная в заголовочном файле
//qwer.h class qwer { public: extern int a; }; //qwer.cpp #include &quot;qwer.h&quot;

Обьявление идентификатора в заголовочном файле
Добрый день, подскажите как исправить ошибку Ошибка C2065 Triangle: необъявленный идентификатор и ошибку error C2146: синтаксическая...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru