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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.74
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.08.2011, 02:55     Инициализация массива в конструкторе #1
Здравствуйте, я хотел бы узнать, возможна ли инициализация массива в конструкторе без использования циклов?

Вот пример конструктора
C++
1
2
3
4
5
6
7
8
Cards::Cards()
{
    for ( int i = 0; i <= 3; i++ )
        for ( int j = 0; j <= 12; j++ )
            deck[ i ][ j ] = 0;
 
    srand( time( 0 ) );
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
03.08.2011, 03:01     Инициализация массива в конструкторе #2
memset(deck, 0, sizeof(deck));
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.08.2011, 03:25  [ТС]     Инициализация массива в конструкторе #3
Цитата Сообщение от niXman Посмотреть сообщение
memset(deck, 0, sizeof(deck));
Спасибо, посмотрел в сети про эту функцию, почти понял что она делает. Но так же нашел вот еще что

http://www.rsdn.ru/forum/cpp/1437721.flat.aspx

Там в одном из ответ сказано что для правильного заполнения нужно пользоваться функцией std::fill(). И я понял что чего то не понял Объясните пожалуйста.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
03.08.2011, 04:06     Инициализация массива в конструкторе #4
fill можно также пользоваться
memset пришла из С -> более низкоуровневая.
чтобы примерно понять как работает fill:
http://www.cplusplus.com/reference/algorithm/fill/

впрочем в некоторых реализациях fill внутри себя может вызывать memset...

http://habrahabr.ru/blogs/cpp/118716/ тут интимные подробности

Добавлено через 4 минуты
впрочем есть и разница.

memset устанавливает значение каждого байта в заданной области.
надо учитывать это ...
fill же смотрит на тип параметра и уже инициализирует не побайтно а по привычному нам.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.08.2011, 04:18  [ТС]     Инициализация массива в конструкторе #5
Ясно, спасибо. Думаю что лучше все же пользоваться тогда memset. Осталось о ней подробнее узнать и почитать
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
03.08.2011, 06:24     Инициализация массива в конструкторе #6
Цитата Сообщение от Toshkarik Посмотреть сообщение
Ясно, спасибо. Думаю что лучше все же пользоваться тогда memset. Осталось о ней подробнее узнать и почитать
Все зависит от устройства класса.
Если у вас в классе указатель и вы сами вызываете new(), то memset() вполне допустима. Если же у вас в классе вектор, то лучше пользоваться fill().
Все равно изучать стандартные алгоритмы придется - профи обязан знать stl.
Сыроежка
Заблокирован
03.08.2011, 20:17     Инициализация массива в конструкторе #7
Цитата Сообщение от Toshkarik Посмотреть сообщение
Спасибо, посмотрел в сети про эту функцию, почти понял что она делает. Но так же нашел вот еще что

http://www.rsdn.ru/forum/cpp/1437721.flat.aspx

Там в одном из ответ сказано что для правильного заполнения нужно пользоваться функцией std::fill(). И я понял что чего то не понял Объясните пожалуйста.
Алгоритм fill не просто использовать с двумерными массивами. То есть без специально написанного предиката не обойдешься. Фактически, вам придется писать два вложенных в друг друга алгоритма fill, один из которых вы будете вызывать явно, а другой будет запрятан в вашем предикате.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.08.2011, 00:15  [ТС]     Инициализация массива в конструкторе #8
Спасибо за ответ, это я уже понял когда попробовал

Добавлено через 21 минуту
Что бы не создавать новую тему думаю спрошу лучше здесь. А как инициализировать константы в классах? Ведь нужно их инициализировать при объявлении, получается это нужно делать в интерфейсе? Или объявлять и инициализировать в конструкторе?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
04.08.2011, 00:20     Инициализация массива в конструкторе #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
А как инициализировать константы в классах?
В списке инициализации конструктора
C++
1
2
3
4
struct A{
  const int val_;
  A(int val) : val_(val) {}
};
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.08.2011, 01:14  [ТС]     Инициализация массива в конструкторе #10
Что то голова совсем не варит, можно по подробней пожалуйста. Это должно быть в заголовке или в реализации?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
04.08.2011, 01:17     Инициализация массива в конструкторе #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это должно быть в заголовке или в реализации?
это уж как вам угодно, главное чтобы было только в одном месте, а не в обоих
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.08.2011, 02:41  [ТС]     Инициализация массива в конструкторе #12
Как я понял, для того, чтобы использовать константы в нескольких функциях класса, нужно их определять только в объявлении класса? Потому что пробовал объявить в конструкторе, а функции их не видят...

Добавлено через 41 минуту
Добавлю - именно в данный момент меня интересует инициализация двух массивов указателей

C++
1
2
static const char *suit[ 4 ] = { "черви", "буби", "крести", "пики" };
static const char *face[ 13 ] = { "Туз", "Двойка", "Тройка", "Четверка", "Пятерка", "Шестерка", "Семерка", "Восьмерка", "Девятка", "Десятка", "Валет", "Дама", "Кароль" };
Делаю задания из книги Дейтлов. Там эти массивы определенны в функции, которая их использует. Но у меня появилась нужда использовать их еще в другой функции. Конечно можно было их определить и во второй. Но если их используют больше функций? Возможно ли как то их инициализировать что бы к ним могли получить доступ все функции класса?
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
04.08.2011, 02:53     Инициализация массива в конструкторе #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
class Simple{
public:
    static const char *suit[ 4 ];
    static const char *face[ 13 ];  
};
const char *Simple::suit[ 4 ] = { "черви", "буби", "крести", "пики" };
const char *Simple::face[ 13 ] = { "Туз", "Двойка", "Тройка", "Четверка", "Пятерка", "Шестерка", "Семерка", "Восьмерка", "Девятка", "Десятка", "Валет", "Дама", "Кароль" };
int main(){
    cout<<Simple::face[1];
        return 0;
}
вот так, раз вы решили делать их статическими.
только вот зачем их статическими делать?)
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.08.2011, 03:12  [ТС]     Инициализация массива в конструкторе #14
Статическими они были в функции, собственно я их оттуда и скопировал. А если использовать не статические массивы? Просто при удаление static пишет что не статический элемент данных не может быть определен вне соответствующего класса.
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
04.08.2011, 03:27     Инициализация массива в конструкторе #15
Цитата Сообщение от Toshkarik Посмотреть сообщение
Статическими они были в функции, собственно я их оттуда и скопировал. А если использовать не статические массивы? Просто при удаление static пишет что не статический элемент данных не может быть определен вне соответствующего класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
class Simple{
public:
    const char *suit[ 4 ];
    const char *face[ 13 ]; 
    Simple()
    {
        suit[0]="test";
        suit[1]="test2";
    }
};
int main(){
    Simple test;
    cout<<test.suit[0]<<endl<<test.suit[1];
    return 0;
}
и т.д.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2011, 03:33     Инициализация массива в конструкторе
Еще ссылки по теме:

C++ Задание размера и инициализация массива указателей в конструкторе
Инициализация char в конструкторе C++
C++ Инициализация *char в конструкторе

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.08.2011, 03:33  [ТС]     Инициализация массива в конструкторе #16
Блин, я догадывался что только так, но надеялся что можно будет уложиться в 2 оператора Спасибо.
Yandex
Объявления
04.08.2011, 03:33     Инициализация массива в конструкторе
Ответ Создать тему
Опции темы

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