Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2011, 19:38   #1
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию Инициализация константным массивом

Добрый день,

с c# можно написать вот так, например:

Код:
Values.AddRange(new int[] { 1, 2, 3, 5, 7 });
В связи с этим закрался вопрос, можно ли сделать что-либо подобное на плюсах. Повторение синтаксиса в точности не интересует, но интересно, можно ли проинициализировать массив как-нибудь вот так:

Код:
Values = { 1, 2, 3, 5, 7};
или подобным образом (при условии определения для своего класса любых необходимых функций). Ну и еще вопрос по поводу того, как в плюсах константные массивы задаются, а то подзабыл, а найти пока не могу.
mMAg вне форума Ответить с цитированием
Старый 18.05.2011, 20:12   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Можно, но только в стандарте C++0x. Для этого в качестве параметра нужно указывать std::initializer_list<T>.
Код:
const int const_array = { 1, 2, 3, 4, 5, 6, 7 };
так?
netrino вне форума Ответить с цитированием
Старый 18.05.2011, 20:18   #3
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Можно, но только в стандарте C++0x. Для этого в качестве параметра нужно указывать std::initializer_list<T>.
Код:
const int const_array = { 1, 2, 3, 4, 5, 6, 7 };
так?
Возможно, вы имели ввиду вот такую инициализацию:

Код:
const int[] const_array = { 1, 2, 3, 4, 5, 6, 7 };
Да, спасибо, на часть вопроса это отвечает. Уже успел нарыть, но это не совсем то, что меня интересует. Такую инициализацию нельзя сделать в поле класса, и в конструкторе тоже не получается. Я сейчас уже копаю в сторону создания функции наподобие той, что в шарпах. Или хотя бы передачи в конструктор константного массива.
mMAg вне форума Ответить с цитированием
Старый 18.05.2011, 20:49   #4
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Вот примерный код того, что у меня сейчас есть:

Код:
int temp[] = {5, 6, 7};

class MyRec
{
public:

    Values<3> values;
    ProxyKeys<3> keys;
    AnsiString levels;

    MyRec()
    {
        keys.AddRange(temp);
        levels = "1,3";
    };

};
Собственно, хотелось бы запихнуть инициализацию куда-нибудь в класс, причем как особо не важно, а не объявлять отдельный массив за его пределами. Пока что пытаюсь безуспешно...
mMAg вне форума Ответить с цитированием
Старый 18.05.2011, 21:00   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Совершенно верно, я пропустил квадратные скобки.
Боюсь, без использования доп. массива никак это не сделать. Так как даже стандартные контейнеры для инициализации используют их (но в новом стандарте реализована инициализация также и через initializer_list).
Код:
int temp[3] = { 1, 2, 3 };
std::vector<int> vec(temp, temp + 3);
Ну и у вас тогда будет как то так
Код:
class MyRec
{
//...
  MyRec(int* begin, int* end) { ... }
// or
  MyRec(int* source, size_t size) { ... }
// or
  template <typename Iter>
  MyRec(Iter begin, Iter end) { ... } // реализация аналогичная конструктору с int*, int*
  // но также можно будет инициализировать элементами стандартных контейнеров
}; // Здесь точка с запятой нужна, но после методов/функций - нет.

Последний раз редактировалось netrino; 18.05.2011 в 21:04.
netrino вне форума Ответить с цитированием
Старый 18.05.2011, 21:25   #6
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Да, видел такую инициализацию вектора.

В общем, я как раз старался минимизировать количество кода в пользовательском классе. Забил на инициализацию константным массивом, решил сделать так:

Код:
class MyRec
{
public:

    Values<3> values;
    ProxyKeys<3> keys;
    AnsiString levels;
    Hints<2> names;

    MyRec()
    {
        keys = "1,2,3";
        levels = "1,3";
    };
};
То бишь мой шаблон ProxeKeys, в котором хранится необходимый массив интов просто инициализируется строкой. Ну и там внутри оператора присваивания необходимый парсинг. Другого более короткого варианта не вижу...
mMAg вне форума Ответить с цитированием
Старый 18.05.2011, 21:45   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Кстати, вызвать конструктор членов класса можно так:
Код:
class MyRec {
...
  MyRec() : keys("1,2,3") { }
};
Но в любом случае, со строкой плохая идея. Во-первых, это накладные расходы, во-вторых, это не очевидное решение, так сказать, так не принято делать
Если Вы хотите конструировать keys в своём конструкторе (без получения данных извне) и для Вас не столь важна его инициализация конкретно массивом, то можно перегрузить для ProxyKeys и Values оператор << и производить инициализацию так
Код:
 keys << 1 << 2 << 3;
 levels << 1 << 3;
netrino вне форума Ответить с цитированием
Старый 18.05.2011, 22:30   #8
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Спасибо за замечание На этот случай добавлю еще инициализацию строкой через конструктор.

А можно подробнее про накладные расходы? Какие именно?
Ну а что касается неочевидного решения, то это не есть какая-то трагедия. Это же всего лишь диплом. В любом случае, я оставил для этого шаблона и другие способы инициализации, просто со строкой наиболее короткий, пусть и неочевидный.
С перегрузкой оператора << хорошая идея, даже в голову не приходило, обязательно предусмотрю такой вариант.
mMAg вне форума Ответить с цитированием
Старый 18.05.2011, 23:53   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Я имел ввиду накладные расходы в виде выделения и конвертирования числа из строчного типа в численный, Вы ведь собираетесь как-то работать с переданными числами. Безусловно, это не столь трагично, просто замечание, так как мне не нравится такой способ, но дело Ваше
netrino вне форума Ответить с цитированием
Старый 19.05.2011, 02:02   #10
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

А, ну если это, тогда ясно. Мне, конечно, тоже это не греет душу, но экземляр класса будет единожды создаваться, поэтому это не трагедия
Спасибо за помощь.
mMAg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
инициализация массива parazzzitka93 Общие вопросы C/C++ 11 02.04.2011 21:01
Инициализация Aleksey1989 Общие вопросы Delphi 10 11.09.2010 21:50
Ошибка инициализация Krumyura Общие вопросы C/C++ 2 22.03.2010 14:08
Инициализация Krumyura Общие вопросы C/C++ 5 20.03.2010 23:37
Инициализация DirectX Pedro Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 30.09.2009 21:06