Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 74, средняя оценка - 4.89
alexsvk
8 / 8 / 7
Регистрация: 15.07.2010
Сообщений: 255
#1

Инициализация статического массива - C++

08.05.2011, 23:37. Просмотров 10577. Ответов 45
Метки нет (Все метки)

Добрый вечер!
Допустим, что имеется класс
C++
1
2
3
4
5
6
7
class A
{
....
public:
static int array[];
....
};
Как инициализировать массив в stdafx.h, если в нём будет 700 элементов, вводимых не вручную?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2011, 23:37
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Инициализация статического массива (C++):

Инициализация статического массива
Ребята, помогите пожалуйста. Не получается проинициализировать NULL-ами...

Инициализация статического поля
Добрый день, как объяснить необходимость объявить все статические поля, даже...

Инициализация статического члена из шаблонного класса
Добрый день. Есть код: template<int test> class Test { template<int a>...

Инициализация константного статического объекта - члена класса
Здравствуйте, у меня возникла проблема с инициализацией статического объекта,...

Инициализация статического члена std::vector в шаблонном классе
есть класс myclass , владеющий классом struct template<class T> class...

Обнуление статического массива
Нужна помощь с обнулением массива,который записан в файл и выведен на экран...

45
mansp
18 / 18 / 7
Регистрация: 07.11.2010
Сообщений: 136
08.05.2011, 23:51 #2
дык можно в конструкторе.... ну и лучше сразу пропиши тогда int array[700] или же сделай его динамичным и в констркторе выдели память и заполни
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
09.05.2011, 00:39 #3
mansp, В конструкторе статику придерживаясь текущего стандарта? Ну-ну
0
alexsvk
8 / 8 / 7
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 10:42  [ТС] #4
Сделал следующее в stdafx.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void initDaysTillJan1()
{
    int j, i;
    Date::DAYS_TILL_JAN1 [0] = 0;
    for(i = 1, j = 1800; i < 700; ++i, ++j)
    {
        if(j%4 == 0 && j%100 != 0)
            Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 366;
        else
            if(j%4 == 0 && j%100 == 0 && j%400 == 0)
                Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 366;
            else
                Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 365;
    }
};
В результате:
1>Date.obj : error LNK2001: unresolved external symbol "public: static int * Date:AYS_TILL_JAN1" (?DAYS_TILL_JAN1@Date@@2PAHA)
1>stdafx.obj : error LNK2001: unresolved external symbol "public: static int * Date:AYS_TILL_JAN1" (?DAYS_TILL_JAN1@Date@@2PAHA)
1>C:\Users\AlexSvk\Documents\Visual Studio 2010\Projects\M_A_WEISS\chapter_2\2-23\Debug\2-23.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
09.05.2011, 15:27 #5
Если Date и DAYS_TILL_JAN1 второго исходника есть A и array первого исходника, то тебе нужно где-то ещё и определить (define) массив, потому как static объявление переменной в теле класса - это только описание (declare)

Т.е.

C++
1
2
3
4
5
6
7
8
9
10
// Это, грубо говоря, в файле *.h
class Date
{
  ...
  static int DAYS_TILL_JAN1[700];
  ...
};
 
// Это, грубо говоря, в файле *.cpp
int Date::DAYS_TILL_JAN1[700];
Почитай ещё этот пост (да и всю ту тему) http://www.cyberforum.ru/cpp-beginne...ml#post1469429
0
alexsvk
8 / 8 / 7
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 16:14  [ТС] #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
class Date
{
public:
    Date(int y = FIRST_YEAR, int m = 1, int d = 1);
    ~Date();
 
    const Date& operator+=(const Date&);
    int operator-(const Date&);
    int operator+(const int);
    bool operator<(const Date&);
 
    static int DAYS_TILL_FIRST_OF_MONTH[];
    static int DAYS_TILL_JAN1[700];
 
    bool isLeapYear(int) const;
private:
    enum {FIRST_YEAR = 1800, MAX_YEAR = 2500};
    int totalDays;
};
 
std::istream& operator>>(std::istream&, Date&);
std::ostream& operator<<(std::ostream&, const Date&);
.cpp
C++
1
2
3
4
5
6
#include "StdAfx.h"
#include "Date.h"
 
int Date::DAYS_TILL_JAN1[700];
int Date::DAYS_TILL_FIRST_OF_MONTH [] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
...
stdafx.h
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
27
28
29
30
31
32
// stdafx.h : in    clude file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
 
#pragma once
 
#include "targetver.h"
 
#include <stdio.h>
#include <tchar.h>
#include <iostream>
 
#include "Date.h"
 
 
 
void initDaysTillJan1()
{
    int j, i;
    Date::DAYS_TILL_JAN1 [0] = 0;
    for(i = 1, j = 1800; i < 700; ++i, ++j)
    {
        if(j%4 == 0 && j%100 != 0)
            Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 366;
        else
            if(j%4 == 0 && j%100 == 0 && j%400 == 0)
                Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 366;
            else
                Date::DAYS_TILL_JAN1 [i] = Date::DAYS_TILL_JAN1 [i-1] + 365;
    }
};
Вывожу все элементы массива Date:AYS_TILL_JAN1. Выводятся нули, т.е. ф-ция initDaysTillJan1() не сработала.

Ах, да, если вызываю ф-цию в main'е, то следующая хрень в итоге:
2-23.obj : error LNK2005: "void __cdecl initDaysTillJan1(void)" (?initDaysTillJan1@@YAXXZ) already defined in stdafx.obj
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
09.05.2011, 16:16 #7
Цитата Сообщение от alexsvk Посмотреть сообщение
Выводятся нули, т.е. ф-ция initDaysTillJan1() не сработала
А ты её вообще запускал?
0
alexsvk
8 / 8 / 7
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 16:18  [ТС] #8
Цитата Сообщение от Evg Посмотреть сообщение
А ты её вообще запускал?
Выше подправил пост.
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
09.05.2011, 16:33 #9
Так объяви функцию в файле *.cpp, а не *.h.

Хотя на мой взгляд куда логичнее было бы в Date создать статический метод для инициализации массива, чем сбоку рисовать функцию initDaysTillJan1
2
alexsvk
8 / 8 / 7
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 16:58  [ТС] #10
Цитата Сообщение от Evg Посмотреть сообщение
Так объяви функцию в файле *.cpp, а не *.h.

Хотя на мой взгляд куда логичнее было бы в Date создать статический метод для инициализации массива, чем сбоку рисовать функцию initDaysTillJan1
Почему статический метод, разве это критично?
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
09.05.2011, 18:42 #11
Цитата Сообщение от alexsvk Посмотреть сообщение
Почему статический метод, разве это критично?
Нестатический метод как бы содержит this и как бы требует объекта. В данном случае сие не нужно и как бы потребуется создавать объект, чтобы запустить нестатический метод.
1
alexsvk
8 / 8 / 7
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 19:01  [ТС] #12
Допустим, в классе есть поле
static const int array[];
При инициализации оного, снимая в цикле константность с помощью оператора приведения типа, вернётся ли константность для каждого элемента после?
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
09.05.2011, 19:09 #13
То, что помечено как const, может быть только явным образом статически проинциаилизировано. В коды ты уже проинициализировать не сможешь. Я согласен с тем, что возможность заманчивая, когда можно динамически проинициализировать, а потом сказать, что это будет const, но сие в языке низкого уровня не реализуемо
0
alexsvk
8 / 8 / 7
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 19:19  [ТС] #14
Цитата Сообщение от Evg Посмотреть сообщение
То, что помечено как const, может быть только явным образом статически проинциаилизировано.
Это связано с тем, что константе свойственны глобальность и уникальность имени?
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
09.05.2011, 23:01 #15
Константность - это запрет на запись. К глобальности и универсальности имени вообще никакого отношения не имеет
0
alexsvk
8 / 8 / 7
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 23:56  [ТС] #16
Цитата Сообщение от Evg Посмотреть сообщение
Константность - это запрет на запись. К глобальности и универсальности имени вообще никакого отношения не имеет
Да, но меня заинтересовала фраза "статически инициализирована..". Что это значит?
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
10.05.2011, 08:17 #17
Цитата Сообщение от alexsvk Посмотреть сообщение
Да, но меня заинтересовала фраза "статически инициализирована..". Что это значит?
Это значит НЕ в тексте исполняемой части программы. Другими словами, инициализация прямо в момент объявления (definition) переменной. Статическая в том смысле, что не динамическая

C
1
2
/* Статическая инициализация */
int const a = 5;
C
1
2
3
4
5
6
7
8
/* Динамическая инициализация. const нельзя */
int a;
 
int main (void)
{
  a = 5;
  ...
}
1
alexsvk
8 / 8 / 7
Регистрация: 15.07.2010
Сообщений: 255
10.05.2011, 21:44  [ТС] #18
Немного отдалюсь от главной темы.
Что значит описатель volatile, его отличия от const?
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
10.05.2011, 22:13 #19
Цитата Сообщение от alexsvk Посмотреть сообщение
Что значит описатель volatile, его отличия от const?
Это вообще два разных ключевых слова, о различиях говорить бессмысленно.
По идее ключевое слово volatile должно запрещать оптимизацию переменной. Подразумевается, что переменная может быть изменена внешне, чем-то еще кроме текущего исполняемого кода. Компилятор обязан выполнять все указанные действия над переменной, отмеченной как volatile.
const - это запрет на изменение (запись).
0
alexsvk
8 / 8 / 7
Регистрация: 15.07.2010
Сообщений: 255
10.05.2011, 22:15  [ТС] #20
Не достаточно ясное объяснение...
0
10.05.2011, 22:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2011, 22:15
Привет! Вот еще темы с решениями:

Размер статического массива
Можно ли задавть размер статического массива во время работы программы? Если...

Из статического массива в динамический
Здравствуйте . Помогите , пожалуйста , переделать эту программу(сортировку) ,...

Стек на основе статического массива
Здравствуйте! Помогите пожалуйста выполнить задание. Сама уже весь форум...

Автоматическое заполнение статического массива
Ребят, хэлп! Мне нужно для статистического массива, заполненного рандомно...


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

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

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