Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Можно ли в массиве хранить ссылки на структуры созданные в теле цикла? / 9 сообщений из 9, страница 1 из 1
30.10.2017, 16:48
    #39544653
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
Предположим есть цикл, в котором создаются структуры и складываются в массив (я не привожу остального кода объекта, чтобы сконцентировать мысль на конкретном вопросе):

Код: plaintext
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.
    template <class Type> class SmartArray
    {
        Type* Array;
      
    public:
        
        //добавление элементов массива
        inline void Add(const Type& Value, const int Index)
        {
             *(Array + Index) = Value;
        }
};    

void MyFunc()
{
    struct WeightStruct{
        int Weight;
    };

    SmartArray<struct WeightStruct> FullData;

    for(int i=0; i<10; ++i)
    {
            struct WeightStruct Data;
            Data.Weight = 25;
            FullData.Add(ShrinkStruct, i);
    }
}



Беспокоит то, что структуры создаются в цикле и при переходе на следующую итерацию "теряют значения"(потому что происходит выход за их область видимости), а объект хранит ссылки на эти структуры. Не "обнулятся" ли все данные в массиве?
...
Рейтинг: 0 / 0
30.10.2017, 16:58
    #39544661
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
AlekseySQLБеспокоит то, что структуры создаются в цикле и при переходе на следующую итерацию "теряют значения"(потому что происходит выход за их область видимости), а объект хранит ссылки на эти структуры. Не "обнулятся" ли все данные в массиве?
Тут ссылку ты передаёшь в метод Add(), а этот метод в массиве сохраняет не ссылку, а копию объекта на который ссылается ссылка. Всё корректно.
...
Рейтинг: 0 / 0
30.10.2017, 17:01
    #39544663
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
Ты хранишь не ссылки, а копии, т.к. это копирование
Код: plaintext
1.
             *(Array + Index) = Value;


и писать лучше так
Код: plaintext
1.
             Array[Index] = Value;


это тоже самое, но читабельнее.
...
Рейтинг: 0 / 0
30.10.2017, 17:06
    #39544668
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
petrav и Dima T, спасибо!
Вы молодечики:)
...
Рейтинг: 0 / 0
30.10.2017, 17:18
    #39544679
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
А если попытаться оптимизировать и принимать возвращаемое значение из функции по ссылке:

Код: plaintext
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.
38.
39.
40.
template <class Type> class SmartArray
    {
        Type* Array;
      
    public:
        
        //добавление элементов массива
        inline void Add(const Type& Value, const int Index)
        {
             *(Array + Index) = Value;
        }

        //получение элементов массива
        inline Type GetValue(const int CurrentIndex) const
        {
            return *(Array + CurrentIndex);
        }
};    

void MyFunc()
{
    struct WeightStruct{
        int Weight;
    };

    SmartArray<struct WeightStruct> FullData;

    for(int i=0; i<10; ++i)
    {
            struct WeightStruct Data;
            Data.Weight = 25;
            FullData.Add(ShrinkStruct, i);
    }

     for(int i=0; i<10; ++i)
    {
            struct WeightStruct& Data = FullData.GetData(i);
            cout >> Data.Weight;
    }
}



Во втором цикле я передаю структуру по ссылке, а не по значению, поэтому для крупных структур должно работать побыстрее. Правильно мыслю?
...
Рейтинг: 0 / 0
30.10.2017, 17:24
    #39544681
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
AlekseySQL, я тут упустил кое что, но думаю понятно. Из GetValue нужно вернуть ссылку.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//получение элементов массива
const Type &GetValue(const int CurrentIndex) const
{
    return Array[CurrentIndex];
}

for(int i=0; i<10; ++i)
{
    const WeightStruct &Data = FullData.GetData(i);
    cout >> Data.Weight;
}
...
Рейтинг: 0 / 0
30.10.2017, 17:36
    #39544693
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
petrav, спасибо,

в книжке "Полный справочник С++" Шилдта приведен пример с ссылкой на возвращаемое значение функции только для вызовов функций, стоящих в левой части равенства. Оказывается есть и другой вариант заюзать ссылки.
...
Рейтинг: 0 / 0
30.10.2017, 17:52
    #39544708
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
ИМХО Велосипедостроением занимаешься. Возьми std::vector
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    std::vector<struct WeightStruct> FullData;
    FullData.reserve(10);

    for(int i=0; i<10; ++i)
    {
            struct WeightStruct Data;
            Data.Weight = 25;
            FullData.push_back(data);
    }

     for(auto& v : FullData)
    {
            cout >> v.Weight;
    }
...
Рейтинг: 0 / 0
30.10.2017, 18:26
    #39544734
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
Dima TИМХО Велосипедостроением занимаешься. Возьми std::vector


Велосипедостроениее- мое любимое занятие:)

А если по- чесноку, то мой массив двумерный, и объект берет на себя задачи создания вложенных массивов и их удаления. К тому же моя поделка работает быстрее вектора.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Можно ли в массиве хранить ссылки на структуры созданные в теле цикла? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]