Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Genn55
378 / 225 / 108
Регистрация: 26.12.2012
Сообщений: 744
#1

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

08.10.2014, 23:01. Просмотров 1674. Ответов 9
Метки нет (Все метки)

Доброго всем времени суток!Помогите разобраться.Есть класс.Нужно вектор заполнить из статического массива,своего рода константной таблицей.
Пытаюсь делать так:
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
33
34
35
36
37
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <windows.h>
#include <math.h>
#include <numeric>
#include <functional>
 
 class S
 {
 public:
    S ();
    void print();//печать вектора
 private:
    double arr[];
    std::vector< double >vec;
 } ;
  S::S ()
  {
    double arr[] ={1.25,1.32,1.40,1.8,2,3.5};
    //for( size_t j = 0 ; j < 6; ++j )
    //vec.push_back (arr[j]);
    std::vector<double> vec (arr, arr + sizeof arr / sizeof *arr );
  }
 void S::print()//печать вектора
 {
    for (std::vector<double>::const_iterator it = vec.begin(); it != vec.end(); ++it)
    std::cout << *it << "  ";
 }
 
int main()
{
    S foo ;
    foo.print();
    return 0;
}
Не работает.В цикле работает(закомментированные строки).Что я делаю не так.Или вообще все это глупость?
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2014, 23:01
Ответы с готовыми решениями:

Инициализация объектов класса в конструкторе другого класса
У меня есть класс Subscriber,в котором есть несколько объектов другого класса...

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

Инициализация вектора массивом
Можно ли как-то упростить эту запись? int fib={1,1,2}; int tri={1,3,6};...

Инициализация вектора класса
Здравствуйте. Следующий код не работает: struct stRefName { AnsiString...

Инициализация вектора с несколькими типами данных или объектами класса
Задача наподобие книжной библиотеки. Есть класс Book в котором перечислены...

9
DrOffset
7958 / 4624 / 1125
Регистрация: 30.01.2014
Сообщений: 7,524
08.10.2014, 23:15 #2
Цитата Сообщение от Genn55 Посмотреть сообщение
Не работает.
Работает. Ты просто не то делаешь. Ты создал новый объект vec в теле конструктора, а объект vec в классе остался пустым.
Используй список инициализации.

В С++11 можно так:
C++
1
2
3
4
S::S ()
    : vec({1.25,1.32,1.40,1.8,2,3.5})
{
}
В С++98 простого синтаксиса нет, но можно так:
C++
1
2
3
4
5
6
static const double arr[] ={1.25,1.32,1.40,1.8,2,3.5};
 
S::S ()
    : vec (arr, arr + sizeof arr / sizeof *arr )
{
}
Или так:
C++
1
2
3
4
5
6
7
8
9
10
inline std::vector<double> internal_init()
{
    const double arr[] ={1.25,1.32,1.40,1.8,2,3.5};
    return  std::vector<double>(arr, arr + sizeof arr / sizeof *arr );
}
 
S::S ()
    : vec ( internal_init() )
{
}
1
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.10.2014, 23:28 #3
В дополнение к ответу DrOffset: можно заполнить и уже созданный вектор. Например так:
C++
1
vec.assign(arr, arr + sizeof arr / sizeof *arr ); // вместо 24 строки
Но заполнение в списке инициализации конструктора лучше.
1
Genn55
378 / 225 / 108
Регистрация: 26.12.2012
Сообщений: 744
08.10.2014, 23:29  [ТС] #4
Ага! Понял.Что то подобное подозревал,но .......Спасибо огромное!
0
Tulosba
08.10.2014, 23:33
  #5

Не по теме:

P.S. кстати, sizeof без скобок как-то для меня не логичен. При использовании типа в качестве аргумента скобки всё равно придется поставить, поэтому для однообразия лучше всегда использовать скобки.

0
Genn55
378 / 225 / 108
Регистрация: 26.12.2012
Сообщений: 744
08.10.2014, 23:45  [ТС] #6
Цитата Сообщение от DrOffset Посмотреть сообщение
static const double arr[] ={1.25,1.32,1.40,1.8,2,3.5};
Это у меня не работает.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.10.2014, 23:50 #7
Цитата Сообщение от Genn55 Посмотреть сообщение
Это у меня не работает.
Надо разбить на объявление и определение:
C++
1
2
3
4
5
struct S
{
    static const double arr[]; // объявление 
};
const double S::arr[] ={1.25,1.32,1.40,1.8,2,3.5}; // определение и инициализация
0
Genn55
378 / 225 / 108
Регистрация: 26.12.2012
Сообщений: 744
09.10.2014, 00:29  [ТС] #8
Я так и сделал.Ошибку нашел.У меня в коде был перегружен оператор [].Убрал все заработало.
0
Ilot
Эксперт С++
1830 / 1188 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
09.10.2014, 12:21 #9
Раз уж речь зашла за С++11 то можно построить и конструктор для инициализации массивом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
#include <initializer_list>
class S {
    std::vector<double>vec;
public:
    S(const std::initializer_list<double>& il): vec(il)
    {}
    void print() {
        for(unsigned i = 0; i < vec.size(); ++i)
            std::cout << vec[i] << ' ';
    }
};
int main() {
    S s = {4.1, 8.5, 9.8, 1.3};
    s.print();
    return 0;
}
0
Tulosba
09.10.2014, 12:31     Инициализация вектора статическим массивом в конструкторе класса
  #10

Не по теме:

Ilot, насчет передачи std::initializer_list по ссылке.

0
09.10.2014, 12:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2014, 12:31
Привет! Вот еще темы с ответами:

Матрица со статическим массивом
Собсна сделал матрицу по динамическому. Понятия не имею, как переделать её под...

Ошибки при работе со статическим массивом. C++ Windows Forms
Здравствуйте! Пишу в Windows Forms C++ тетрис. Он практически готов, но...

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


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

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

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