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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 74, средняя оценка - 4.89
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
#1

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

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

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

Инициализация статического массива - C++
Ребята, помогите пожалуйста. Не получается проинициализировать NULL-ами статиеский массив указателей. Пишет слудеющее (прикрепил скриншот)....

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
mansp
18 / 18 / 0
Регистрация: 07.11.2010
Сообщений: 136
08.05.2011, 23:51 #2
дык можно в конструкторе.... ну и лучше сразу пропиши тогда int array[700] или же сделай его динамичным и в констркторе выдели память и заполни
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.05.2011, 00:39 #3
mansp, В конструкторе статику придерживаясь текущего стандарта? Ну-ну
alexsvk
8 / 8 / 1
Регистрация: 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 ==========
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,126
Записей в блоге: 26
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];
Почитай ещё этот пост (да и всю ту тему) Массивы в заголовочных файлах
alexsvk
8 / 8 / 1
Регистрация: 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
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,126
Записей в блоге: 26
09.05.2011, 16:16 #7
Цитата Сообщение от alexsvk Посмотреть сообщение
Выводятся нули, т.е. ф-ция initDaysTillJan1() не сработала
А ты её вообще запускал?
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 16:18  [ТС] #8
Цитата Сообщение от Evg Посмотреть сообщение
А ты её вообще запускал?
Выше подправил пост.
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,126
Записей в блоге: 26
09.05.2011, 16:33 #9
Так объяви функцию в файле *.cpp, а не *.h.

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

Хотя на мой взгляд куда логичнее было бы в Date создать статический метод для инициализации массива, чем сбоку рисовать функцию initDaysTillJan1
Почему статический метод, разве это критично?
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,126
Записей в блоге: 26
09.05.2011, 18:42 #11
Цитата Сообщение от alexsvk Посмотреть сообщение
Почему статический метод, разве это критично?
Нестатический метод как бы содержит this и как бы требует объекта. В данном случае сие не нужно и как бы потребуется создавать объект, чтобы запустить нестатический метод.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 19:01  [ТС] #12
Допустим, в классе есть поле
static const int array[];
При инициализации оного, снимая в цикле константность с помощью оператора приведения типа, вернётся ли константность для каждого элемента после?
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,126
Записей в блоге: 26
09.05.2011, 19:09 #13
То, что помечено как const, может быть только явным образом статически проинциаилизировано. В коды ты уже проинициализировать не сможешь. Я согласен с тем, что возможность заманчивая, когда можно динамически проинициализировать, а потом сказать, что это будет const, но сие в языке низкого уровня не реализуемо
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
09.05.2011, 19:19  [ТС] #14
Цитата Сообщение от Evg Посмотреть сообщение
То, что помечено как const, может быть только явным образом статически проинциаилизировано.
Это связано с тем, что константе свойственны глобальность и уникальность имени?
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,126
Записей в блоге: 26
09.05.2011, 23:01 #15
Константность - это запрет на запись. К глобальности и универсальности имени вообще никакого отношения не имеет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2011, 23:01
Привет! Вот еще темы с ответами:

Размер статического массива - C++
Можно ли задавть размер статического массива во время работы программы? Если нет, то почему?#include &lt;iostream&gt; using namespace std; ...

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

Очередь на основе статического массива - C++
в очередь с экрана вводятся строки,когда вводится строка end,элементы извлекаются из очереди и записываются в файл. xD.h #include...

Стек на базе статического массива - C++
Здравствуйте помогите, верней напишите за меня пожалуйста стек на базе статического массива. требования для массива: 1)тип элементов -...


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

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

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