Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго всем времени суток!Помогите разобраться.Есть класс.Нужно вектор заполнить из статического массива,своего рода константной таблицей.
Пытаюсь делать так:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2014, 23:01
Ответы с готовыми решениями:

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно,...

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

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

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

9
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
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
:)
Эксперт С++
4773 / 3267 / 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
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
08.10.2014, 23:29  [ТС] 4
Ага! Понял.Что то подобное подозревал,но .......Спасибо огромное!
0
Tulosba
08.10.2014, 23:33
  #5

Не по теме:

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

0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
08.10.2014, 23:45  [ТС] 6
Цитата Сообщение от DrOffset Посмотреть сообщение
static const double arr[] ={1.25,1.32,1.40,1.8,2,3.5};
Это у меня не работает.
0
:)
Эксперт С++
4773 / 3267 / 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
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
09.10.2014, 00:29  [ТС] 8
Я так и сделал.Ошибку нашел.У меня в коде был перегружен оператор [].Убрал все заработало.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2014, 12:31

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

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

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

В чем разница между динамическим массивом и статическим?
ребята, я не понимаю различия. вроде читал литературу. ну вот говорят, что динамический массив,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru