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

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

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

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

20.03.2011, 16:58. Просмотров 5160. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массивы в заголовочных файлах (C++):

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

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

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

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

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

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

41
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);
};
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
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
1
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
20.03.2011, 19:44  [ТС] #33
C++
1
2
3
 Сообщение от Dimarik__ 
funct(arr, cdd);
зачем??
это я псевдокод написал, потому что в реальном коде слишком много строк. Чтобы проще было проанализировать какие ошибки.
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
20.03.2011, 19:48 #34
Цитата Сообщение от Dimarik__ Посмотреть сообщение
это я псевдокод написал
я это понял я спрашивал
зачем функции члену класса, ты даешь адрес члена класса???
она и так знает про его существование
0
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
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
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:
может из за этого (или это описка)
1
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????
Меня единственная вещь смущает. Когда это вызовется? При вызове конструктора или как?
И как по поводу
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
20.03.2011, 20:39 #38
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Потому что он static??
по моему да. и еще константа
представь что та создашь несколько объектов
и каждый раз конструктор будет инициализировать массив
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Когда это вызовется? При вызове конструктора или как
по моему при компиляции
1
Evg
Эксперт CАвтор FAQ
17934 / 6160 / 408
Регистрация: 30.03.2009
Сообщений: 16,909
Записей в блоге: 27
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) обычной внешней переменной (но по имени она доступна только внутри класса, другой принципиальной разницы нет).
2
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 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;
}
3
ZiM
0 / 0 / 0
Регистрация: 18.05.2009
Сообщений: 10
21.03.2011, 04:23 #41
1)Написати програму, яка обчислює середню (за тиждень) температуру повітря. Початкові дані повинні вводитися під час роботи програми. Вид екрану, який рекомендується, приведений нижче (дані, введені користувачем, виділені напівжирним шрифтом).
Введіть температуру повітря за тиждень.
Понеділок -> 12
Вівторок -> 10
Середа -> 16
Четвер -> 18
П'ятниця -> 17
Субота -> 16
Неділя -> 14
Середня температура за тиждень: 14.71 град.


2)Напишіть програму, яка обчислює часткову суму ряду: 1-1/3+1/5-1/7+1/9-... і порівнює отримане значення з π/4 (при додаванні достатньо великої кількості членів цього ряду, величина часткової суми наближається до π/4).



3)Написати програму, яка обчислює середнє арифметичне послідовності дробових чисел, які вводяться з клавіатури. Кількість чисел повинна задаватися під час роботи програми. Вид екрану, який рекомендується, приведений нижче.
Обчислення середнього арифметичного послідовності дробових чисел.
Введіть кількість чисел послідовності -> 5
Введіте послідовність. Після введення кожного числа натискайте <Enter> -> 5.4 -> 7.8 -> 3.0 -> 1.5 -> 2.3



4)Написати програму, яка вводить по рядках з клавіатури двовимірний масив і обчислює суму його елементів по стовпцях.
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 1
21.03.2011, 04:28 #42
Цитата Сообщение от Kastaneda Посмотреть сообщение
поскольку константа ДОЛЖНА быть инициализированна в момент создания, то при выполнении тела конструктора, она должна быть УЖЕ инициализированна.
Может не совсем понятно объяснил:
Константа должна быть инициализированна до выполнения конструктора, т.к. в противном случае осталась бы возможность отложить инициализацию до более поздней стадии выполнения конструктора, а это означает, что константа оставалась бы неинициализированной в течении некоторого времени. Кроме того ни что не помешало бы изменять значение константы в теле конструктора.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2011, 04:28
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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