Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.89
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
#1

Массивы в заголовочных файлах - C++

20.03.2011, 16:58. Просмотров 4754. Ответов 41
Метки нет (Все метки)

в заголовочном файле в описании класса пишу:


C++
1
int _const_iMas[4] = {0x63,0x7c,0x78,0x79};
В итоге компилятор подчёркивает знак '=' и выдает ошибки:

Error 1 error C2059: syntax error : '{' c:\users\dimarik\desktop\lalala\lal ala\file.h 15
Error 2 error C2334: unexpected token(s) preceding '{'; skipping apparent function body c:\users\dimarik\desktop\lalala\lal ala\file.h 15
Error 3 error C2059: syntax error : '{' c:\users\dimarik\desktop\lalala\lal ala\file.h 15
Error 4 error C2334: unexpected token(s) preceding '{'; skipping apparent function body c:\users\dimarik\desktop\lalala\lal ala\file.h 15

Можно ли в заголовочном файле создать массив констант?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
neske
1463 / 830 / 69
Регистрация: 26.03.2010
Сообщений: 2,830
20.03.2011, 17:00     Массивы в заголовочных файлах #2
delll
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
20.03.2011, 17:02     Массивы в заголовочных файлах #3
объяви его в С
а в заголовочном файле опиши внешним extern

Добавлено через 1 минуту
или может тебе подойдет enum
Evg
Эксперт CАвтор FAQ
17293 / 5541 / 347
Регистрация: 30.03.2009
Сообщений: 15,083
Записей в блоге: 26
20.03.2011, 17:03     Массивы в заголовочных файлах #4
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Можно ли в заголовочном файле создать массив констант?
Можно, но по-хорошему так не делают. Ошибка у тебя из-за чего-то другого. Покажи код на несколько строк выше и ниже этого места (или лучше вообще весь код)
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
20.03.2011, 17:05     Массивы в заголовочных файлах #5
Цитата Сообщение от neske Посмотреть сообщение
CodeBlocks компилирует без проблем
судя по ошибкам
этот заголовок подключен к нескольким файлам
==двойное определение
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 17:10  [ТС]     Массивы в заголовочных файлах #6
Цитата Сообщение от Evg Посмотреть сообщение
Можно, но по-хорошему так не делают. Ошибка у тебя из-за чего-то другого. Покажи код на несколько строк выше и ниже этого места (или лучше вообще весь код)
ошибка в этом, потму что до добавления этого массива в файл, всё нормально работало. Двойного определения нет, потому что стоит защита в виде #ifndef....
Мне нужен массив, который будет являться private и который не будет переопределяться в классе. Я читал в литературе, если мы не будем изменять содержимое переменных, необходимо определять её как константу. Здесь аналогично то же самое или как? Как правильно надо делать?
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
20.03.2011, 17:35     Массивы в заголовочных файлах #7
давай по порядку
Цитата Сообщение от Dimarik__ Посмотреть сообщение
защита в виде #ifndef
не всегда спасает отца "русской демократии"
на лицо кросс-определения когда два блока лезут к одному определению
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Мне нужен массив, который будет являться private
он является членом класса??

и чем тебе enum не угодил?

Добавлено через 17 минут
Цитата Сообщение от Dimarik__ Посмотреть сообщение
определять её как константу
у тебя нет определение константы const
Evg
Эксперт CАвтор FAQ
17293 / 5541 / 347
Регистрация: 30.03.2009
Сообщений: 15,083
Записей в блоге: 26
20.03.2011, 17:35     Массивы в заголовочных файлах #8
Цитата Сообщение от ValeryS Посмотреть сообщение
и чем тебе enum не угодил?
А с какого перепугу там вообще enum должен быть? Не говоря уж о том, что человек спрашивает о причинах конкретной проблемы, а не о том, как её затоптать
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 17:36  [ТС]     Массивы в заголовочных файлах #9
не всегда спасает отца "русской демократии"
на лицо кросс-определения когда два блока лезут к одному определению
В смысле?

он является членом класса??
Да.
и чем тебе enum не угодил?
То есть такое через массивы сделать не вариант и нужен обязательно enum? С массивами просто привычнее
Evg
Эксперт CАвтор FAQ
17293 / 5541 / 347
Регистрация: 30.03.2009
Сообщений: 15,083
Записей в блоге: 26
20.03.2011, 17:36     Массивы в заголовочных файлах #10
Dimarik__, пока ты не покажешь нормально исходник, разговор, скорее всего, будет довольно беспредметным
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 17:37  [ТС]     Массивы в заголовочных файлах #11
нет определения как const - это я код криво скопировал.
C++
1
const int _const_iMas[4] = {0x63,0x7c,0x78,0x79};
Evg
Эксперт CАвтор FAQ
17293 / 5541 / 347
Регистрация: 30.03.2009
Сообщений: 15,083
Записей в блоге: 26
20.03.2011, 17:39     Массивы в заголовочных файлах #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Да
Вот показал бы исходник - сразу бы тебе ответили на вопрос. Внутри класс у тебя описываются ПОЛЯ класса, а не глобальные переменные. Класс - это описание типа, а потому он не может содержать данных

Добавлено через 1 минуту
Файл *.h:

C++
1
2
3
4
class T
{
  static const int arr[4];
};
Файл *.cpp:

C++
1
const int T::arr[4] = { 1, 2, 3, 4 };
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 17:40  [ТС]     Массивы в заголовочных файлах #13
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
#ifndef file
#define file
#include <string>
#endif
using namespace std;
 
class Cryptograph
{
    private:
        string _sText;
 
 
    const int _const_iMas[4] = {0x63,0x7c,0x78,0x79};
 
 
        /////////////////////////////////////////////////
        //Методы
        ////////////////////////////////////////////////////
        void convertStringTo3dArray(string &str_1, unsigned char *** array_1,
            unsigned char *** array_2, unsigned long long a, int b, int c);
 
        
    public:
        Cryptograph(char* cText, char* cKey);//конструктор
 
};
Evg
Эксперт CАвтор FAQ
17293 / 5541 / 347
Регистрация: 30.03.2009
Сообщений: 15,083
Записей в блоге: 26
20.03.2011, 17:41     Массивы в заголовочных файлах #14
Dimarik__, в посте 12 уже написал
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 17:43  [ТС]     Массивы в заголовочных файлах #15
А почему когда я пишу
C++
1
static const int const_int_charsInBlock = 16;//из скольки символов будет стостоять блок
всё работает нормально, а когда пишу
C++
1
static const int _const_iMas[4] = {0x63,0x7c,0x78,0x79};
компилятор ругается
Evg
Эксперт CАвтор FAQ
17293 / 5541 / 347
Регистрация: 30.03.2009
Сообщений: 15,083
Записей в блоге: 26
20.03.2011, 17:45     Массивы в заголовочных файлах #16
Цитата Сообщение от Dimarik__ Посмотреть сообщение
А почему когда я пишу
Одно из раздолбайских свойств языка Си++. Для целочисленных переменных сие разрешено. Из тех соображений, что при любой попытке чтения переменной реально будет подставляться константа. Но адрес вроде бы как взять будет нельзя. Если ты вместо int'а подставишь float, то скорее всего будет ошибка
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 17:48  [ТС]     Массивы в заголовочных файлах #17
C++
1
static const int const_int_charsInBlock = 16;//из скольки символов будет стостоять блок
и ещё. скажи, пожалуйста, почему выше указанной код в этом посте не работал без static?
Evg
Эксперт CАвтор FAQ
17293 / 5541 / 347
Регистрация: 30.03.2009
Сообщений: 15,083
Записей в блоге: 26
20.03.2011, 17:51     Массивы в заголовочных файлах #18
static означает поле, единое для всех экземпляров данного класса. По сути дела это означает отдельная глобальная переменная, которая доступна только методам данного класса. А без static - это обычное поле структуры или класса. Описание структуры или класса - это описание типа. Оно НЕ является "материальным" (т.е. типу ничего не соответствует в машине). Материальным является лишь объект (переменная или динамически выделенный экземпляр класса). И данными можно инициализировать лишь объект. Когда ты пишешь "static const int qqq = 16;" то почему-то разработчики Си++ порешили, что здесь как бы задаётся не статическое поле класса (т.е. не объект), а константа (т.е. не материальная субстанция)
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
20.03.2011, 17:55     Массивы в заголовочных файлах #19
Цитата Сообщение от Dimarik__ Посмотреть сообщение
То есть такое через массивы сделать не вариант и нужен обязательно enum? С массивами просто привычнее
ну тут дело вкуса мне enum более привычен
хотя зависит от задачи

Цитата Сообщение от Dimarik__ Посмотреть сообщение
static const int _const_iMas[4] = {0x63,0x7c,0x78,0x79};
класс это просто описатель и пока не объявлен хоть один объект в памяти место под класс не выделяется и компилятор просто не может(не знает) куда пихать твои константы.


Цитата Сообщение от Dimarik__ Посмотреть сообщение
static const int const_int_charsInBlock = 16;
по моему делать так тоже не рекомендуется
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2011, 17:57     Массивы в заголовочных файлах
Еще ссылки по теме:

C++ Статические свойства структур в заголовочных файлах
Иерархия заголовочных файлов C++
Определение переменных в заголовочных файлах C++
Линковка, реализация в заголовочных файлах C++
C++ Куча ошибок в заголовочных файлах,вызванных из windows.h!

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17293 / 5541 / 347
Регистрация: 30.03.2009
Сообщений: 15,083
Записей в блоге: 26
20.03.2011, 17:57     Массивы в заголовочных файлах #20
Цитата Сообщение от ValeryS Посмотреть сообщение
ну тут дело вкуса мне enum более привычен
И как через enum будет выражаться "_const_iMas[i+1]"?
Yandex
Объявления
20.03.2011, 17:57     Массивы в заголовочных файлах
Ответ Создать тему
Опции темы

Текущее время: 07:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru