Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.69/32: Рейтинг темы: голосов - 32, средняя оценка - 4.69
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
#1

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

20.03.2011, 16:58. Просмотров 5745. Ответов 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

Можно ли в заголовочном файле создать массив констант?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2011, 16:58
Ответы с готовыми решениями:

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

О стандартных заголовочных файлах
Не знаю в какую категорию отнести данное нубство, но все же: Часто использую...

Определение переменных в заголовочных файлах
Здорова! Определил переменную в заголовочном фале от так #pragma once...

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

Странные объявления функций в заголовочных файлах
Пытаюсь потихоньку разобраться в C++. Когда читаешь теорию, почти все понятно,...

41
neske
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
20.03.2011, 17:00 #2
delll
0
ValeryS
Модератор
7169 / 5436 / 674
Регистрация: 14.02.2011
Сообщений: 18,366
20.03.2011, 17:02 #3
объяви его в С
а в заголовочном файле опиши внешним extern

Добавлено через 1 минуту
или может тебе подойдет enum
0
Evg
Эксперт CАвтор FAQ
19128 / 6969 / 522
Регистрация: 30.03.2009
Сообщений: 19,617
Записей в блоге: 30
20.03.2011, 17:03 #4
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Можно ли в заголовочном файле создать массив констант?
Можно, но по-хорошему так не делают. Ошибка у тебя из-за чего-то другого. Покажи код на несколько строк выше и ниже этого места (или лучше вообще весь код)
1
ValeryS
Модератор
7169 / 5436 / 674
Регистрация: 14.02.2011
Сообщений: 18,366
20.03.2011, 17:05 #5
Цитата Сообщение от neske Посмотреть сообщение
CodeBlocks компилирует без проблем
судя по ошибкам
этот заголовок подключен к нескольким файлам
==двойное определение
1
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 17:10  [ТС] #6
Цитата Сообщение от Evg Посмотреть сообщение
Можно, но по-хорошему так не делают. Ошибка у тебя из-за чего-то другого. Покажи код на несколько строк выше и ниже этого места (или лучше вообще весь код)
ошибка в этом, потму что до добавления этого массива в файл, всё нормально работало. Двойного определения нет, потому что стоит защита в виде #ifndef....
Мне нужен массив, который будет являться private и который не будет переопределяться в классе. Я читал в литературе, если мы не будем изменять содержимое переменных, необходимо определять её как константу. Здесь аналогично то же самое или как? Как правильно надо делать?
0
ValeryS
Модератор
7169 / 5436 / 674
Регистрация: 14.02.2011
Сообщений: 18,366
20.03.2011, 17:35 #7
давай по порядку
Цитата Сообщение от Dimarik__ Посмотреть сообщение
защита в виде #ifndef
не всегда спасает отца "русской демократии"
на лицо кросс-определения когда два блока лезут к одному определению
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Мне нужен массив, который будет являться private
он является членом класса??

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

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

он является членом класса??
Да.
и чем тебе enum не угодил?
То есть такое через массивы сделать не вариант и нужен обязательно enum? С массивами просто привычнее
0
Evg
Эксперт CАвтор FAQ
19128 / 6969 / 522
Регистрация: 30.03.2009
Сообщений: 19,617
Записей в блоге: 30
20.03.2011, 17:36 #10
Dimarik__, пока ты не покажешь нормально исходник, разговор, скорее всего, будет довольно беспредметным
1
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 17:37  [ТС] #11
нет определения как const - это я код криво скопировал.
C++
1
const int _const_iMas[4] = {0x63,0x7c,0x78,0x79};
0
Evg
Эксперт CАвтор FAQ
19128 / 6969 / 522
Регистрация: 30.03.2009
Сообщений: 19,617
Записей в блоге: 30
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 };
1
Dimarik__
21 / 21 / 3
Регистрация: 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);//конструктор
 
};
0
Evg
Эксперт CАвтор FAQ
19128 / 6969 / 522
Регистрация: 30.03.2009
Сообщений: 19,617
Записей в блоге: 30
20.03.2011, 17:41 #14
Dimarik__, в посте 12 уже написал
1
Dimarik__
21 / 21 / 3
Регистрация: 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};
компилятор ругается
0
Evg
Эксперт CАвтор FAQ
19128 / 6969 / 522
Регистрация: 30.03.2009
Сообщений: 19,617
Записей в блоге: 30
20.03.2011, 17:45 #16
Цитата Сообщение от Dimarik__ Посмотреть сообщение
А почему когда я пишу
Одно из раздолбайских свойств языка Си++. Для целочисленных переменных сие разрешено. Из тех соображений, что при любой попытке чтения переменной реально будет подставляться константа. Но адрес вроде бы как взять будет нельзя. Если ты вместо int'а подставишь float, то скорее всего будет ошибка
1
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 17:48  [ТС] #17
C++
1
static const int const_int_charsInBlock = 16;//из скольки символов будет стостоять блок
и ещё. скажи, пожалуйста, почему выше указанной код в этом посте не работал без static?
0
Evg
Эксперт CАвтор FAQ
19128 / 6969 / 522
Регистрация: 30.03.2009
Сообщений: 19,617
Записей в блоге: 30
20.03.2011, 17:51 #18
static означает поле, единое для всех экземпляров данного класса. По сути дела это означает отдельная глобальная переменная, которая доступна только методам данного класса. А без static - это обычное поле структуры или класса. Описание структуры или класса - это описание типа. Оно НЕ является "материальным" (т.е. типу ничего не соответствует в машине). Материальным является лишь объект (переменная или динамически выделенный экземпляр класса). И данными можно инициализировать лишь объект. Когда ты пишешь "static const int qqq = 16;" то почему-то разработчики Си++ порешили, что здесь как бы задаётся не статическое поле класса (т.е. не объект), а константа (т.е. не материальная субстанция)
0
ValeryS
Модератор
7169 / 5436 / 674
Регистрация: 14.02.2011
Сообщений: 18,366
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;
по моему делать так тоже не рекомендуется
0
Evg
Эксперт CАвтор FAQ
19128 / 6969 / 522
Регистрация: 30.03.2009
Сообщений: 19,617
Записей в блоге: 30
20.03.2011, 17:57 #20
Цитата Сообщение от ValeryS Посмотреть сообщение
ну тут дело вкуса мне enum более привычен
И как через enum будет выражаться "_const_iMas[i+1]"?
0
20.03.2011, 17:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2011, 17:57

Объявлние классов в разных заголовочных файлах
Приветствую всех участников форума. Есть 2 класса А и В. Каждый из содержит...

Статические свойства структур в заголовочных файлах
Всем привет. Не могу найти в интернете инфу о том, как ведут себя статические...

Использование указателей на контейнеры STL в заголовочных файлах
Для использования указателей на I/O классы достаточно включить &lt;iosfwd&gt; который...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru