Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.74
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
#1

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

03.08.2011, 02:55. Просмотров 8187. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2011, 02:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Инициализация массива в конструкторе (C++):

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

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

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

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

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

Инициализация *char в конструкторе
Хай эврибади! class A { private: int a; int b; char *str; public:...

15
niXman
Эксперт С++
3202 / 1451 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
03.08.2011, 03:01 #2
memset(deck, 0, sizeof(deck));
1
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
03.08.2011, 03:25  [ТС] #3
Цитата Сообщение от niXman Посмотреть сообщение
memset(deck, 0, sizeof(deck));
Спасибо, посмотрел в сети про эту функцию, почти понял что она делает. Но так же нашел вот еще что

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

Там в одном из ответ сказано что для правильного заполнения нужно пользоваться функцией std::fill(). И я понял что чего то не понял Объясните пожалуйста.
0
OstapBender
584 / 523 / 75
Регистрация: 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 же смотрит на тип параметра и уже инициализирует не побайтно а по привычному нам.
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
03.08.2011, 04:18  [ТС] #5
Ясно, спасибо. Думаю что лучше все же пользоваться тогда memset. Осталось о ней подробнее узнать и почитать
0
ValeryLaptev
Эксперт С++
1049 / 828 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
03.08.2011, 06:24 #6
Цитата Сообщение от Toshkarik Посмотреть сообщение
Ясно, спасибо. Думаю что лучше все же пользоваться тогда memset. Осталось о ней подробнее узнать и почитать
Все зависит от устройства класса.
Если у вас в классе указатель и вы сами вызываете new(), то memset() вполне допустима. Если же у вас в классе вектор, то лучше пользоваться fill().
Все равно изучать стандартные алгоритмы придется - профи обязан знать stl.
0
Сыроежка
Заблокирован
03.08.2011, 20:17 #7
Цитата Сообщение от Toshkarik Посмотреть сообщение
Спасибо, посмотрел в сети про эту функцию, почти понял что она делает. Но так же нашел вот еще что

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

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

Добавлено через 21 минуту
Что бы не создавать новую тему думаю спрошу лучше здесь. А как инициализировать константы в классах? Ведь нужно их инициализировать при объявлении, получается это нужно делать в интерфейсе? Или объявлять и инициализировать в конструкторе?
0
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
04.08.2011, 00:20 #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
А как инициализировать константы в классах?
В списке инициализации конструктора
C++
1
2
3
4
struct A{
  const int val_;
  A(int val) : val_(val) {}
};
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
04.08.2011, 01:14  [ТС] #10
Что то голова совсем не варит, можно по подробней пожалуйста. Это должно быть в заголовке или в реализации?
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
04.08.2011, 01:17 #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это должно быть в заголовке или в реализации?
это уж как вам угодно, главное чтобы было только в одном месте, а не в обоих
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
04.08.2011, 02:41  [ТС] #12
Как я понял, для того, чтобы использовать константы в нескольких функциях класса, нужно их определять только в объявлении класса? Потому что пробовал объявить в конструкторе, а функции их не видят...

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

C++
1
2
static const char *suit[ 4 ] = { "черви", "буби", "крести", "пики" };
static const char *face[ 13 ] = { "Туз", "Двойка", "Тройка", "Четверка", "Пятерка", "Шестерка", "Семерка", "Восьмерка", "Девятка", "Десятка", "Валет", "Дама", "Кароль" };
Делаю задания из книги Дейтлов. Там эти массивы определенны в функции, которая их использует. Но у меня появилась нужда использовать их еще в другой функции. Конечно можно было их определить и во второй. Но если их используют больше функций? Возможно ли как то их инициализировать что бы к ним могли получить доступ все функции класса?
0
silentnuke
Android Programmer
139 / 140 / 10
Регистрация: 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;
}
вот так, раз вы решили делать их статическими.
только вот зачем их статическими делать?)
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
04.08.2011, 03:12  [ТС] #14
Статическими они были в функции, собственно я их оттуда и скопировал. А если использовать не статические массивы? Просто при удаление static пишет что не статический элемент данных не может быть определен вне соответствующего класса.
0
silentnuke
Android Programmer
139 / 140 / 10
Регистрация: 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;
}
и т.д.
1
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
04.08.2011, 03:33  [ТС] #16
Блин, я догадывался что только так, но надеялся что можно будет уложиться в 2 оператора Спасибо.
0
04.08.2011, 03:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2011, 03:33
Привет! Вот еще темы с решениями:

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

Инициализация строковых массивов в конструкторе
Здравствуйте уважаемые гуру. Задачка: Нужно инициализировать массив char'ов...

Инициализация перемнных класса в конструкторе
Есть ли разница между Constructor():var_1(VAL), var_2(VAL) {} и ...

Инициализация вектора статическим массивом в конструкторе класса
Доброго всем времени суток!Помогите разобраться.Есть класс.Нужно вектор...


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

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

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