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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.89
Dimarik__
 Аватар для Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 16:58     Массивы в заголовочных файлах #1
в заголовочном файле в описании класса пишу:


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

Можно ли в заголовочном файле создать массив констант?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dimarik__
 Аватар для 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
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
20.03.2011, 18:15     Массивы в заголовочных файлах #22
Цитата Сообщение от Evg Посмотреть сообщение
И как через enum будет выражаться "_const_iMas[i+1]"?
а ни как
сказал же зависит от задачи
если у меня есть какие то константы
то мне(ключевое слово МНЕ) привычней пользоваться перечислением

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

Добавлено через 1 минуту
Насколько я знаю (правда не именно в этом случае, а в общем) надо где только можно стараться избегать всяческих переопределений. Например, не рекомендуется создавать поле int a1, а затем в качестве аргументов функции прописывать funct(int a1)....
Это в общем... По поводу конкретно этого случая не знаю, поэтому и спрашиваю.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
20.03.2011, 18:24     Массивы в заголовочных файлах #24
Цитата Сообщение от Dimarik__ Посмотреть сообщение
int a1, а затем в качестве аргументов функции прописывать funct(int a1)....
ну здесь то из-за другого
в функции будет
a1=a1
и кто здесь аргумент, а кто член класса
перекрытие имен однако
Dimarik__
 Аватар для 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
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
20.03.2011, 18:29     Массивы в заголовочных файлах #26
не это уже линкер

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

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

Добавлено через 1 минуту
а ты не пытаешься ее где то поменять
Dimarik__
 Аватар для 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
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
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
для зашиты
Dimarik__
 Аватар для Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 19:29  [ТС]     Массивы в заголовочных файлах #31
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "F_.h"
#include "stdafx.h"
#pragma once
 
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);
}
ОШИБКИ:

Error 2 error C2653: 'F' : is not a class or namespace name c:\users\dimarik\desktop\someproject\someproject\f_.cpp 5
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\dimarik\desktop\someproject\someproject\f_.cpp 6
Error 5 error C2653: 'F' : is not a class or namespace name c:\users\dimarik\desktop\someproject\someproject\f_.cpp 9
Error 6 error C2653: 'F' : is not a class or namespace name c:\users\dimarik\desktop\someproject\someproject\f_.cpp 13
Error 7 error C2065: 'arr' : undeclared identifier c:\users\dimarik\desktop\someproject\someproject\f_.cpp 16

Добавлено через 33 секунды
зАГОЛОВОЧНЫЙ ФАЙЛ:
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);
};
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
20.03.2011, 19:38     Массивы в заголовочных файлах #32
Цитата Сообщение от Dimarik__ Посмотреть сообщение
#pragma once
первой строкой в заголовочном файле

Цитата Сообщение от Dimarik__ Посмотреть сообщение
const int arr[4] = {1, 2, 3, 4};
выведи из конструктора
Цитата Сообщение от Dimarik__ Посмотреть сообщение
funct(arr, cdd);
зачем??


Цитата Сообщение от Dimarik__ Посмотреть сообщение
void F::funct(const int * a, int &c)
{
c = a[0];
}
вот здесь и стучись к массиву
функция его увидит
к статическим элементам по моему просто так не обращяются
или так
F::arr
или так
this->arr
Dimarik__
 Аватар для Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 19:44  [ТС]     Массивы в заголовочных файлах #33
C++
1
2
3
 Сообщение от Dimarik__ 
funct(arr, cdd);
зачем??
это я псевдокод написал, потому что в реальном коде слишком много строк. Чтобы проще было проанализировать какие ошибки.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
20.03.2011, 19:48     Массивы в заголовочных файлах #34
Цитата Сообщение от Dimarik__ Посмотреть сообщение
это я псевдокод написал
я это понял я спрашивал
зачем функции члену класса, ты даешь адрес члена класса???
она и так знает про его существование
Dimarik__
 Аватар для Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 20:10  [ТС]     Массивы в заголовочных файлах #35
Просто часто приходится из одной функции вызывать другую.
пЧому у меня такую бредятину пишет компилятор, что F - это не пространство имён и не класс?

Добавлено через 1 минуту
Если пропишу одно включение в F.cpp, то будет уже одна ошибка, но другая, совсем другая
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "F_.h"
 
 
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);
}
Добавлено через 13 секунд
Error 2 error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "StdAfx.h"' to your source? c:\users\dimarik\desktop\someproject\someproject\f_.cpp 17
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
20.03.2011, 20:26     Массивы в заголовочных файлах #36
а хрен его знает
я взял твои классы доработал как тебе советовал и все пошло
F.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include "F.h"
 
 
 const int F::arr[4] = {1, 2, 3, 4};
F::F(int a)
{
       
}
void F::funct(const int * a, int &c)
{
        c = a[0];
}
void F::function2(int &c)
{
        int cdd = 5;
        funct(this->arr, cdd);
}
F.h
C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
 
class F
{
        private:   
                static const int arr[4];
                void funct(const int * a, int &c);
        public:
                F(int a);
                void function2(int &c);
};
Добавлено через 1 минуту
Цитата Сообщение от Dimarik__ Посмотреть сообщение
#include "F_.h"
Цитата Сообщение от Dimarik__ Посмотреть сообщение
F.h:
может из за этого (или это описка)
Dimarik__
 Аватар для Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 20:31  [ТС]     Массивы в заголовочных файлах #37
C++
1
 const int F::arr[4] = {1, 2, 3, 4};
Спасибо, теперь работает, когда я определяют этот массив не в конструкторе. А почему я не мог его определить в конструкторе? Потому что он static????
Меня единственная вещь смущает. Когда это вызовется? При вызове конструктора или как?
И как по поводу
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
20.03.2011, 20:39     Массивы в заголовочных файлах #38
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Потому что он static??
по моему да. и еще константа
представь что та создашь несколько объектов
и каждый раз конструктор будет инициализировать массив
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Когда это вызовется? При вызове конструктора или как
по моему при компиляции
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
20.03.2011, 22:42     Массивы в заголовочных файлах #39
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Почему мы делаем переопределение? То есть зачем внутри опять писать const int? Насколько я понимаю, при переопределении мы записываем значения в другой адрес,а не в адрес *arr (адрес, массива, определенного в заголовочном файле)
Или как оно происходит?
По части static членов класса код

C++
1
2
3
4
class C
{
  static const int arr[4];
}
эквивалентен

C
1
extern const int C_arr[4];
а

C++
1
const int C::arr[4];
эквивалентно

C
1
const int C_arr[4];
Т.е. описание static внутри тела класса - это по сути дела описание (т.е. extern) обычной внешней переменной (но по имени она доступна только внутри класса, другой принципиальной разницы нет).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2011, 04:07     Массивы в заголовочных файлах
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
21.03.2011, 04:07     Массивы в заголовочных файлах #40
Сообщение было отмечено автором темы, экспертом или модератором как ответ
По части const членов класса - по скольку константа ДОЛЖНА быть инициализированна в момент создания, то при выполнении тела конструктора, она должна быть УЖЕ инициализированна.
Поэтому const члены класса инициализируются в списке инициализирующих значений конструктора:
C++
1
2
3
4
5
6
7
8
9
10
class A{
   const int x;
public:
    A(int xx):x(xx){};
};
 
int main(){
   A a;
   return 0;
}
Yandex
Объявления
21.03.2011, 04:07     Массивы в заголовочных файлах
Ответ Создать тему
Опции темы

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