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

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

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

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

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

Можно ли в заголовочном файле создать массив констант?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2011, 16:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массивы в заголовочных файлах (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,153
Записей в блоге: 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
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,153
Записей в блоге: 26
20.03.2011, 17:51 #18
static означает поле, единое для всех экземпляров данного класса. По сути дела это означает отдельная глобальная переменная, которая доступна только методам данного класса. А без static - это обычное поле структуры или класса. Описание структуры или класса - это описание типа. Оно НЕ является "материальным" (т.е. типу ничего не соответствует в машине). Материальным является лишь объект (переменная или динамически выделенный экземпляр класса). И данными можно инициализировать лишь объект. Когда ты пишешь "static const int qqq = 16;" то почему-то разработчики Си++ порешили, что здесь как бы задаётся не статическое поле класса (т.е. не объект), а константа (т.е. не материальная субстанция)
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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;
по моему делать так тоже не рекомендуется
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,153
Записей в блоге: 26
20.03.2011, 17:57 #20
Цитата Сообщение от ValeryS Посмотреть сообщение
ну тут дело вкуса мне enum более привычен
И как через enum будет выражаться "_const_iMas[i+1]"?
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 18:10  [ТС] #21
Цитата Сообщение от Evg Посмотреть сообщение
Вот показал бы исходник - сразу бы тебе ответили на вопрос. Внутри класс у тебя описываются ПОЛЯ класса, а не глобальные переменные. Класс - это описание типа, а потому он не может содержать данных

Добавлено через 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 };
А если определять в конструкторе этот массив? Можно ведь будет написать просто
C++
1
const int arr[4] = { 1, 2, 3, 4 };
без указания пространства имён, так как я указываю еего на конструкторе. Так?
И еще. Почему мы делаем переопределение? То есть зачем внутри опять писать const int? Насколько я понимаю, при переопределении мы записываем значения в другой адрес,а не в адрес *arr (адрес, массива, определенного в заголовочном файле)
Или как оно происходит?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.03.2011, 18:15 #22
Цитата Сообщение от Evg Посмотреть сообщение
И как через enum будет выражаться "_const_iMas[i+1]"?
а ни как
сказал же зависит от задачи
если у меня есть какие то константы
то мне(ключевое слово МНЕ) привычней пользоваться перечислением

Добавлено через 1 минуту
Цитата Сообщение от Dimarik__ Посмотреть сообщение
*arr (адрес, массива, определенного в заголовочном файле)
в заголовочном файле нет адреса массива
он появится когда определится объект
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 18:20  [ТС] #23
Так каким образом это переопределение работает?

Добавлено через 1 минуту
Насколько я знаю (правда не именно в этом случае, а в общем) надо где только можно стараться избегать всяческих переопределений. Например, не рекомендуется создавать поле int a1, а затем в качестве аргументов функции прописывать funct(int a1)....
Это в общем... По поводу конкретно этого случая не знаю, поэтому и спрашиваю.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.03.2011, 18:24 #24
Цитата Сообщение от Dimarik__ Посмотреть сообщение
int a1, а затем в качестве аргументов функции прописывать funct(int a1)....
ну здесь то из-за другого
в функции будет
a1=a1
и кто здесь аргумент, а кто член класса
перекрытие имен однако
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 18:28  [ТС] #25
Error 1 error LNK2001: unresolved external symbol "private: static int const * const ClassFile::_const_iMas" (?_const_iMas@ClassFile@@0QBHB) C:\Users\Dimarik\Desktop\lalala\lalala\File.obj
Что тут еще не нравится линковщику?
Компилятор хочет чтобы я прописал массив как extern что ли???

Добавлено через 2 минуты
или же это могло возникнуть по причине что я в функции обращаюсь к массву через
C++
1
void ClassFile::function(unsigned char &value_1,const int * intArraySubstitution);
Добавлено через 1 минуту
в аргмументах функции без ключевого слова const компилятор ругался
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.03.2011, 18:29 #26
не это уже линкер

Цитата Сообщение от Dimarik__ Посмотреть сообщение
unresolved external symbol
неразрешённый внешний символ
т.е приватная переменная снаружи не достучатся
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 18:33  [ТС] #27
C++
1
т.е приватная переменная снаружи не достучатся
я ей пользуюсь только внутри класса

Добавлено через 1 минуту
я её сейчас в public поместил и всё равно линкер ругается
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.03.2011, 18:36 #28
я тебе перевел что пишет линкер
смотри где не внутри класса обращаешься
строку ошибки линкер по моем уже не дает

Добавлено через 1 минуту
а ты не пытаешься ее где то поменять
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 19:09  [ТС] #29
F.h:
C++
1
2
3
4
5
6
7
8
9
class F
{
    private:   
        static const int arr[4];
        void funct(const int * a, int &c);
    public:
        F(int a);
        void function2(int &c);
};
F.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef fi
#define fi
#include "F_.h"
#include "stdafx.h"
#endif
 
F::F(int a)
{
    const int arr[4] = {1, 2, 3, 4};
}
void F::funct(const int * a, int &c)
{
    c = a[0];
}
void F::function2(int &c)
{
    int cdd = 5;
    funct(arr, cdd);
}
 
};
ошибка:
unexpended endif
. Если же я не пишу эту защиту от множества включений, то:

Error 2 error C2653: 'F' : is not a class or namespace name c:\users\dimarik\desktop\ляляляляля\ляляляляля\f_.cpp 6
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\dimarik\desktop\ляляляляля\ляляляляля\f_.cpp 7
Error 5 error C2653: 'F' : is not a class or namespace name c:\users\dimarik\desktop\ляляляляля\ляляляляля\f_.cpp 10
Error 6 error C2653: 'F' : is not a class or namespace name c:\users\dimarik\desktop\ляляляляля\ляляляляля\f_.cpp 14
Error 7 error C2065: 'arr' : undeclared identifier c:\users\dimarik\desktop\ляляляляля\ляляляляля\f_.cpp 17
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.03.2011, 19:16 #30
Цитата Сообщение от Dimarik__ Посмотреть сообщение
ClassFile::function(unsigned char &value_1,const int * intArraySubstitution)
а зачем ты передаешь адрес массива???
функции класса и так увидят члены

Добавлено через 6 минут
Цитата Сообщение от Dimarik__ Посмотреть сообщение
#ifndef fi
#define fi
.......................

#endif
вообще то это в h файл включается

Цитата Сообщение от Dimarik__ Посмотреть сообщение
#include "stdafx.h"
судя по файлу VS
если да то там есть
#pragma once
для зашиты
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2011, 19:16
Привет! Вот еще темы с ответами:

Куча ошибок в заголовочных файлах,вызванных из windows.h! - C++
с чем это может быть связано? этот же код без всяких изменений уже компилировался и работал... 1> Исходный код.cpp 1>c:\program...

Использование указателей на контейнеры STL в заголовочных файлах - C++
Для использования указателей на I/O классы достаточно включить <iosfwd> который содержит опережающие объявления и таким образом появляется...

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

Иерархия заголовочных файлов - C++
Вопрос такой. Есть 2 заголовочных файла с классами: core.h interface.h В core.h происходит #include interface.h В...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.03.2011, 19:16
Ответ Создать тему
Опции темы

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