Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/86: Рейтинг темы: голосов - 86, средняя оценка - 4.91
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461

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

03.08.2011, 02:55. Показов 16207. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, я хотел бы узнать, возможна ли инициализация массива в конструкторе без использования циклов?

Вот пример конструктора
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 ) );
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2011, 02:55
Ответы с готовыми решениями:

Инициализация массива в конструкторе
подскажите пожалуйста, по условиям задачи необходимо создать массив int #include &lt;iomanip&gt; #include &lt;cstdlib&gt; using...

Инициализация массива char в конструкторе
Вопрос такой. Есть класс simple, в классе есть поле char in. Естественно хочу инициализировать это поле в конструкторе. in={0},...

Инициализация элементов массива в конструкторе
Доброго времени суток! Подскажите пожалуйста можно ли инициализировать элементы массива при помощи списка инициализации в конструкторе...

15
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
03.08.2011, 03:01
memset(deck, 0, sizeof(deck));
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
03.08.2011, 03:25  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
memset(deck, 0, sizeof(deck));
Спасибо, посмотрел в сети про эту функцию, почти понял что она делает. Но так же нашел вот еще что

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

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

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

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

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

memset устанавливает значение каждого байта в заданной области.
надо учитывать это ...
fill же смотрит на тип параметра и уже инициализирует не побайтно а по привычному нам.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
03.08.2011, 04:18  [ТС]
Ясно, спасибо. Думаю что лучше все же пользоваться тогда memset. Осталось о ней подробнее узнать и почитать
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
03.08.2011, 06:24
Цитата Сообщение от Toshkarik Посмотреть сообщение
Ясно, спасибо. Думаю что лучше все же пользоваться тогда memset. Осталось о ней подробнее узнать и почитать
Все зависит от устройства класса.
Если у вас в классе указатель и вы сами вызываете new(), то memset() вполне допустима. Если же у вас в классе вектор, то лучше пользоваться fill().
Все равно изучать стандартные алгоритмы придется - профи обязан знать stl.
0
Заблокирован
03.08.2011, 20:17
Цитата Сообщение от Toshkarik Посмотреть сообщение
Спасибо, посмотрел в сети про эту функцию, почти понял что она делает. Но так же нашел вот еще что

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

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

Добавлено через 21 минуту
Что бы не создавать новую тему думаю спрошу лучше здесь. А как инициализировать константы в классах? Ведь нужно их инициализировать при объявлении, получается это нужно делать в интерфейсе? Или объявлять и инициализировать в конструкторе?
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
04.08.2011, 00:20
Цитата Сообщение от Toshkarik Посмотреть сообщение
А как инициализировать константы в классах?
В списке инициализации конструктора
C++
1
2
3
4
struct A{
  const int val_;
  A(int val) : val_(val) {}
};
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
04.08.2011, 01:14  [ТС]
Что то голова совсем не варит, можно по подробней пожалуйста. Это должно быть в заголовке или в реализации?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
04.08.2011, 01:17
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это должно быть в заголовке или в реализации?
это уж как вам угодно, главное чтобы было только в одном месте, а не в обоих
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
04.08.2011, 02:41  [ТС]
Как я понял, для того, чтобы использовать константы в нескольких функциях класса, нужно их определять только в объявлении класса? Потому что пробовал объявить в конструкторе, а функции их не видят...

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

C++
1
2
static const char *suit[ 4 ] = { "черви", "буби", "крести", "пики" };
static const char *face[ 13 ] = { "Туз", "Двойка", "Тройка", "Четверка", "Пятерка", "Шестерка", "Семерка", "Восьмерка", "Девятка", "Десятка", "Валет", "Дама", "Кароль" };
Делаю задания из книги Дейтлов. Там эти массивы определенны в функции, которая их использует. Но у меня появилась нужда использовать их еще в другой функции. Конечно можно было их определить и во второй. Но если их используют больше функций? Возможно ли как то их инициализировать что бы к ним могли получить доступ все функции класса?
0
Android Programmer
141 / 142 / 10
Регистрация: 08.12.2010
Сообщений: 421
04.08.2011, 02:53
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;
}
вот так, раз вы решили делать их статическими.
только вот зачем их статическими делать?)
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
04.08.2011, 03:12  [ТС]
Статическими они были в функции, собственно я их оттуда и скопировал. А если использовать не статические массивы? Просто при удаление static пишет что не статический элемент данных не может быть определен вне соответствующего класса.
0
Android Programmer
141 / 142 / 10
Регистрация: 08.12.2010
Сообщений: 421
04.08.2011, 03:27
Цитата Сообщение от 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;
}
и т.д.
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
04.08.2011, 03:33  [ТС]
Блин, я догадывался что только так, но надеялся что можно будет уложиться в 2 оператора Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.08.2011, 03:33
Помогаю со студенческими работами здесь

Задание размера и инициализация массива указателей в конструкторе
1) h: SDL_Texture *textures; Как задать размер и инициализировать в конструкторе? Если пишу так: SDL_Texture *textures; ...

Инициализация char в конструкторе
class Abit { public: Abit(); ~Abit(); protected: private: bool medal;

инициализация перменных в конструкторе
у меня есть статический вектор векторов инт(vector&lt;vector&lt;int&gt;&gt;),который мне нужно заполнить данными,но при попытке написать ...

Инициализация указателей в конструкторе
Всем привет! Вот интересный вопрос. Написано, что до вызова тела конструктора создаются поля класса. Для пользовательских типов -...

Инициализация *char в конструкторе
Хай эврибади! class A { private: int a; int b; char *str; public: A() : a(0), b(0) { str = '\0'; }


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru