powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
9 сообщений из 9, страница 1 из 1
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
    #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
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
    #39544661
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLБеспокоит то, что структуры создаются в цикле и при переходе на следующую итерацию "теряют значения"(потому что происходит выход за их область видимости), а объект хранит ссылки на эти структуры. Не "обнулятся" ли все данные в массиве?
Тут ссылку ты передаёшь в метод Add(), а этот метод в массиве сохраняет не ссылку, а копию объекта на который ссылается ссылка. Всё корректно.
...
Рейтинг: 0 / 0
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
    #39544663
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты хранишь не ссылки, а копии, т.к. это копирование
Код: plaintext
1.
             *(Array + Index) = Value;


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


это тоже самое, но читабельнее.
...
Рейтинг: 0 / 0
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
    #39544668
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav и Dima T, спасибо!
Вы молодечики:)
...
Рейтинг: 0 / 0
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
    #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
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
    #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
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
    #39544693
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav, спасибо,

в книжке "Полный справочник С++" Шилдта приведен пример с ссылкой на возвращаемое значение функции только для вызовов функций, стоящих в левой части равенства. Оказывается есть и другой вариант заюзать ссылки.
...
Рейтинг: 0 / 0
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
    #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
Можно ли в массиве хранить ссылки на структуры созданные в теле цикла?
    #39544734
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TИМХО Велосипедостроением занимаешься. Возьми std::vector


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

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


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