Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102

Массив указателей на объекты наследуемых классов

11.05.2020, 21:26. Показов 2581. Ответов 29

Студворк — интернет-сервис помощи студентам
Добрый день!

Класс Patircle по задаче должен быть абстрактным, у него два наследника. В задаче сказано "В программе должен быть определён основной класс система, содержащий массив указателей на объекты-частицы".
Пожалуйста, посмотрите ниже по тексту, направляю вам часть программы.

Вопросы:

1. Проверьте пожалуйста правильно ли я написал класс System?
2. Если я буду использовать std::vector<Particle*> particles; как #include <vector> облегчит мне жизнь?
Никогда им не пользовался.
3. Как реализовывается доступ к объектам-частицам(наследуемых классов) через указатель(Particle*) на базовый(абстрактный класс)? Буду рад почитать литературу на эту тему.

Может быть вы еще что то заметите.
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
38
39
40
41
42
43
44
45
46
47
48
49
class Particle {
protected:
    double x, y;
    double vx, vy;
    double radius;
public:
    Particle() : Particle(0, 0, 0, 0, 0) {}
    Particle(double ax, double ay, double avx, double avy, double aradius)
         : x(ax), y(ay), vx(avx), vy(avy), radius(aradius) {}
    virtual ~Particle() {}
    
    //virtual void Collision() = 0;
 
    void Move(time) {
        x += vx * time;
        y += vy * time;
    };
 
};
 
class System {
private:
    // unsigned time;
    // std::vector<Particle*> particles;
    Particle* particles;
    unsigned size;
    unsigned elems;
    static const unsigned defaultSize;
public:
    System() : System(defaultSize) {}
    System(unsigned asize) : elems(0) {
        if(asize < defaultSize)
            asize = defaultSize;
        size = asize;
        particles = new (Particle*)[size] {};
    }
    System(const System& obj) {
        size = obj.size;
        elems = obj.elems;
        particles = new (Particle*)[size] {};
        for( ; particles != NULL ; particles++)
            (*particles) = obj.*particles;
    }
    ~System() { delete[] particles; }
 
    //void add();
    //void delet();
};
const unsigned System::defaultSize = 8;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.05.2020, 21:26
Ответы с готовыми решениями:

Как понять: массив указателей на объекты классов?
если приведете пример буду рад.

Абстрактный класс, массив указателей на объекты производных классов
У меня есть абстрактный класс: class abstract{ public: int field; double method(); }; В нем объявлены поле и метод. Далее...

Виртуальные функции (создать массив указателей на объекты трех классов)
Задание: создать массив указателей на объекты трех классов. Метод Show почему-то не переопределяется. В данном коде вводится 3 элемента в...

29
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.05.2020, 22:53
Цитата Сообщение от Glbvnts Посмотреть сообщение
Класс Patircle по задаче должен быть абстрактным,
Однако единственный абстрактный в-метод - Соударение вы закомментили. Помните - это то за что будете дергать указатели. Грубо говоря, например так:
C++
1
2
3
vector<Parttcles*> parttcles ;
//some fill
parttcles [i]->Collision();
Цитата Сообщение от Glbvnts Посмотреть сообщение
1. Проверьте пожалуйста правильно ли я написал класс System?
нет. Там нет вектора. А если будет то размер не нужно хранить отдельно (он в векторе есть). Указатель на коллекцию тоже не нужен, - хранить объект вектора как поле.
Цитата Сообщение от Glbvnts Посмотреть сообщение
3. Как реализовывается доступ к объектам-частицам(наследуемых классов) через указатель(Particle*) на базовый(абстрактный класс)? Буду рад почитать литературу на эту тему.
В правильном направлении мыслите. Чувствуется физический подход)
https://ru.cppreference.com/w/cpp/container/vector
Там правда написаны перлы вида:
std::vector — последовательный контейнер, инкапсулирующий массивы переменного размера.
На самом деле это шаблон классов контейнеров, где каждый инкапсулирует в объекте один массив произвольного доступа. Если английский в норме - посмотрите другие источники по std::vector.
Обратите внимание на итераторы. Если описание не прочтётся, - значит или вы или ваш препод что-то пропустили.
1
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
11.05.2020, 23:50  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
нет. Там нет вектора. А если будет то размер не нужно хранить отдельно (он в векторе есть). Указатель на коллекцию тоже не нужен, - хранить объект вектора как поле.
Не правильно то что я не использовал вектор или вообще не правильно ? Подскажите пожалуйста, что я сделал не так.

Цитата Сообщение от IGPIGP Посмотреть сообщение
значит или вы или ваш препод что-то пропустили.
Препод не рассказывал о таком вообще.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.05.2020, 23:57
Цитата Сообщение от Glbvnts Посмотреть сообщение
Не правильно то что я не использовал вектор или вообще не правильно ? Подскажите пожалуйста, что я сделал не так.
Там вектором и не пахнет. Есть одна строчка, но она под комментом:
C++
1
// std::vector<Particle*> particles;
а далее - выделение блока памяти под указатели. Выделения для объектов по указателям нет...
Цитата Сообщение от Glbvnts Посмотреть сообщение
Препод не рассказывал о таком вообще.
Он и о динамических массивах похоже не рассказывал. Прогулял все ваши уроки наверное, не иначе? Это бывает. Страницы этого форума просто пропитаны слезами студентов растерзанных несправедливостью.
1
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
12.05.2020, 13:34  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
а далее - выделение блока памяти под указатели. Выделения для объектов по указателям нет..
Я патаюсь понять. Вот например здесь, вместо (Particle*) (int*), разве здесь ptr = new (int*)[size] {}; не будет вызван конструктор по умолчанию для каждого элемента массива? Если бы там был int, то по идее массив был бы проинициализирован 0? По хорошему указатели должны быть на NULL?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class System {
private:
    int* ptr;
    unsigned size;
    unsigned elems;
    static const unsigned defaultSize;
public:
    System() : System(defaultSize) {};   
    System(unsigned asize) : elems(0) {
        if(asize < defaultSize)
            asize = defaultSize;
        size = asize;
        ptr = new (int*)[size] {};
    }
******
};
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.05.2020, 13:42
Цитата Сообщение от Glbvnts Посмотреть сообщение
разве здесь ptr = new (int*)[size] {}; не будет вызван конструктор по умолчанию для каждого элемента массива?
У указателей нет конструкторов. Они как целые типы создаются и всё.
Цитата Сообщение от Glbvnts Посмотреть сообщение
Если бы там был int, то по идее массив был бы проинициализирован 0?
Нет. Там был бы мусор.
Glbvnts, это 1 минута создать такой блок и прочесть что там получилось. Вы не уважаете своё время? Но с небес решение не упадёт ведь. Соберитесь и работайте. Вопросы станут более осмысленными. Во всяком разе есть шанс.
Цитата Сообщение от Glbvnts Посмотреть сообщение
По хорошему указатели должны быть на NULL?
Нет. Не должно.
1
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
12.05.2020, 18:44  [ТС]
[/quote]IGPIGP, посмотрите пожалуйста, сейчас верно?
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
class System {
private:
    Particle** particles;
    unsigned size;
    unsigned elems;
    static const unsigned defaultSize;
public:
    System() : System(defaultSize) {}
    System(unsigned asize) : elems(asize) {
        if(asize < defaultSize)
            asize = defaultSize;
        size = asize;
        particles = new Particle*[size+1];
 
        for (unsigned i = 0 ; i < size; i++) {
            particles[i] = new Particle();
        }
        particles[size+1] = NULL;
    }
    System(const System& obj) {
        size = obj.size;
        elems = obj.elems;
        particles = new Particle*[size+1];
 
        for (unsigned i = 0; i < size+1; i++) 
            particles[i] = obj.particles[i];       
    }
    ~System() { delete[] particles; 
};
const unsigned System::defaultSize = 8;
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.05.2020, 18:57
IGPIGP, посмотрите пожалуйста, сейчас верно?[/quote]
Цитата Сообщение от Glbvnts Посмотреть сообщение
particles[size+1] = NULL;
Во первых, здесь выход за границу массива. Во-вторых этого делать не нужно вообще.

Добавлено через 1 минуту
Цитата Сообщение от Glbvnts Посмотреть сообщение
particles = new Particle*[size+1];
Particle*[size]. Не нужен там лишний элемент

Добавлено через 1 минуту
Цитата Сообщение от Glbvnts Посмотреть сообщение
for (unsigned i = 0; i < size+1; i++)
i < size

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
System(const System& obj) {
    size = obj.size;
    elems = obj.elems;
    particles = new Particle * [size];
 
    for (unsigned i = 0; i < size; i++)
        particles[i] = new Particle(obj.particles[i]);
}
Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
~System()
{
    for (unsigned i = 0; i < size; i++)
        delete particles[i];
 
    delete[] particles;
}
Добавлено через 34 секунды
C++
1
2
3
4
5
6
7
~System()
{
    for (unsigned i = 0; i < size; i++)
        delete particles[i];
 
    delete[] particles;
}
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.05.2020, 18:59
Цитата Сообщение от Glbvnts Посмотреть сообщение
if(asize < defaultSize)
Glbvnts, в конструкторе объект с нуля создаётся. Какое там может быть значение чтобы сравнить с параметром?
Что касается массива. Обычно делают vector<unique_ptr<T>>. Но если хотите делать руками - делайте массив указателей. Можете сделать статический - типа Particle * my_polymolphic_ptrs[N], где N статическая константа. И счетчик последнего заполненного индекса (нулём инициализированный). Тогда добавляя/удаляя указатель будете играть счетчиком вперед/назад и шеренгой бойцов - куда вставлять или вытягивать будете. Это к тому, что механизм поиска вероятно придётся предоставить тоже.
Если хотите выделят память динамически то это почти тоже самое + корзинка какашек с управлением памятью самого массива. Помните. Память под сами объекты всё равно придётся выделять и освобождать. Это потому, что по одним и тем же указателям у вас будут разные звери. Даже по размеру, в общем случае.
Glbvnts, ваша задача сочетает набор подзадач совершенно разного уровня. Если вы должны управлять коллекцией полиморфных указателей, то создавать/удалять массивы и объекты должны не задумываясь. Вряд ли кто захочет для вас это сделать.
1
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
12.05.2020, 19:01  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Во первых, здесь выход за границу массива. Во-вторых этого делать не нужно вообще.
я же на один больше выделил чем size, почему будет ?
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
for (unsigned i = 0; i < size; i++)
        particles[i] = new Particle(obj.particles[i]);
}
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Particle*[size]. Не нужен там лишний элемент
окей, я думал мало ли пригодится мне.

Спасибо!
0
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
12.05.2020, 19:20  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но если хотите делать руками - делайте массив указателей.
По задаче мне нужен как раз массив указателей. Так как пишу программы редко(уже пожалел об этом,нужно больше практики) хотел сделать руками, что бы разобраться.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Если вы должны управлять коллекцией полиморфных указателей
..
Цитата Сообщение от IGPIGP Посмотреть сообщение
что по одним и тем же указателям у вас будут разные звери
..

Именно этого от меня и хотят. IGPIGP, oleg-m1973, подскажите пожалуйста, что за тема и какую литературу почитать? Основная книжка, по которой изучаю это "Введение в язык C++" А.В.Столяров. В закрепе темы скрин раздела Наследование и полиморфизм. Я сейчас на 5.7 Виртуальность в конструкторах и деструкторах. Возможно я еще не прочел нужный параграф.
Миниатюры
Массив указателей на объекты наследуемых классов  
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.05.2020, 22:37
- Доктор, а я после операции смогу играть на скрипке?
- Сможете.
- Доктор, скажите, точно смогу?!
- Точно-точно.
- Странно, до операции не умел, а после смогу.
То есть, вряд ли оно поможет, Glbvnts.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <vector>
#include <memory>
#include <initializer_list>
 
using namespace std;
 
struct Particle
{
virtual void name()=0;
virtual ~Particle(){}
};
 
struct Positron :public Particle
{
    void name(){cout<<"Positron\n";}
};
 
struct Electron :public Particle
{
    void name(){cout<<"Electron\n";}
};
 
struct HiggsBoson :public Particle
{
    void name(){cout<<"HiggsBoson\n";}
};
 
struct Hihix :public Particle
{
    void name(){cout<<"Hihix\n";}
};
 
 
template<typename T>
std::vector<T> vector_from(std::initializer_list<T> il)
{
  std::vector<T> result;
  result.reserve(il.size());
  for (auto& e : il)
    result.push_back(std::move(const_cast<T&>(e)));
  return result;
}
 
class SystemParticles
{
 public:
    SystemParticles(std::initializer_list<unique_ptr<Particle>>& ilist)
    :particles(vector_from(ilist))
    {
 
    }
    void allNames()
    {
        for(const auto &prtcl:particles)prtcl->name();
    }
private:
vector<unique_ptr<Particle>> particles;
};
 
int main()
{
std::initializer_list<unique_ptr<Particle>> ilist=
{
    unique_ptr<Particle>(new Positron),
    unique_ptr<Particle>(new Electron),
    unique_ptr<Particle>(new HiggsBoson),
    unique_ptr<Particle>(new Electron),
    unique_ptr<Particle>(new Hihix),
    unique_ptr<Particle>(new Positron)
};
SystemParticles systemParticles(ilist);
systemParticles.allNames();
return 0;
}
0
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
13.05.2020, 02:37  [ТС]
IGPIGP, То есть, вряд ли оно поможет, Glbvnts.

Спасибо, что верите в меня!
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.05.2020, 02:45
Цитата Сообщение от IGPIGP Посмотреть сообщение
Нет. Там был бы мусор.
Мусора не будет, будет NULL, у него же пустой инициализатор записан (фигурные скобки).
2
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
13.05.2020, 02:48  [ТС]
DrOffset, то есть для тривиальных(не пользовательских) типов данных, в том числе для типов данных вида TYPE* будет вызван конструктор по умолчанию, и каждый указатель будет указывать на NULL?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.05.2020, 03:30
Цитата Сообщение от Glbvnts Посмотреть сообщение
то есть для тривиальных(не пользовательских) типов данных, в том числе для типов данных вида TYPE* будет вызван конструктор по умолчанию, и каждый указатель будет указывать на NULL?
У тривиальных типов нет конструкторов. Правильнее сказать, что каждый из указателей в массиве будет инициализирован как NULL pointer.

Добавлено через 2 минуты
Цитата Сообщение от Glbvnts Посмотреть сообщение
каждый указатель будет указывать на NULL
Это тоже не совсем корректно. Не "указывать на NULL", а сам указатель будет равен NULL. Когда мы говорим "указывать на..." мы имеем в виду указуемый объект, т.к. тот объект, адрес которого хранится в указателе. В вашем же случае NULL будет сам "адрес". Т.е. указуемого объекта в этом случае нет вообще. Вам правильно выше сказали, что в этом случае необходимо выделять память и для него. Но вы также упустили тот момент, что возможно этого делать не стоит. Т.е. возможно ошибка не в том, что вы не создали эти объекты, а в том, что пытаетесь их (несуществующие) копировать (в 42 строке).

Добавлено через 5 минут
Используйте вектор лучше.
Цитата Сообщение от Glbvnts Посмотреть сообщение
Если я буду использовать std::vector<Particle*> particles; как #include <vector> облегчит мне жизнь?
Значительно облегчит.
Хотя бы потому, что выше вы показали неготовность корректно управлять памятью вручную.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.05.2020, 07:11
Цитата Сообщение от DrOffset Посмотреть сообщение
Мусора не будет, будет NULL, у него же пустой инициализатор записан (фигурные скобки).
Прошу прощения - не прав.
0
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
21.05.2020, 23:15  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть, вряд ли оно поможет
Здравствуйте! Разбираюсь в вашем коде, разобрался почти во всех строках.

"Написал" свой, но немного изменив(без шаблона). Много вопросов касательно "range-based for loop".

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class System {
private:
    std::vector<std::unique_ptr<Particle>> particles;
public:
    System(const std::initializer_list<std::unique_ptr<Particle>>& alist) {
        particles.reserve(alist.size());
        for (auto& elem : alist) {
            particles.push_back(std::move(const_cast<std::unique_ptr<Particle>&>(elem)));
        }
    }
 
    void allNames() {
        for (const auto& prtcl : particles) prtcl->Name();
    }
};
C++
1
2
3
4
5
6
7
8
9
10
11
int main() {
        std::initializer_list<std::unique_ptr<Particle>> particlesList {
        std::unique_ptr<Particle>(new lightParticle),
        std::unique_ptr<Particle>(new heavyParticle),
    };
 
    System obj(particlesList);
    obj.allNames();
 
    return 0;
}
ЯВы пишете
C++
1
2
3
    void allNames() {
        for (const auto& prtcl : particles) prtcl->Name();
    }
Я читал, что сами ссылки нельзя изменить(поэтому их инициализируют при объявлении), можно изменить то на что ссылается ссылка.
prtcl имеет тип std::unique_ptr<Particle>&, что это такое? Ссылка на умный указатель, который указывает на класс Particle?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.05.2020, 23:30
Glbvnts, вектор
C++
1
vector<unique_ptr<Particle>> particles;
можно пройти итераторами или даже по индексу, - получив его размер. Для получение размера можно гетер написать.
А на элементе итерации, итераторе например - вы можете обратиться к указателю для обращения к частице. Это не будет выглядеть как майская роза, но вполне дёшево и практично:
C++
1
(*it)->Name();
Цитата Сообщение от Glbvnts Посмотреть сообщение
Я читал, что сами ссылки нельзя изменить(поэтому их инициализируют при объявлении)
Так и есть. Однако блок инициализации цикла это и есть объявление и инициализация. Так устроен range based loop.
Цитата Сообщение от Glbvnts Посмотреть сообщение
std::unique_ptr<Particle>&, что это такое?
Этот зверь не умеет копироваться. Он может лишь сепуку совершать. При копировании он отдаёт всю начинку. Но для этого его надо попросить при помощи std::move. Вот почему ссылка это тот минимум, который разумен и достаточен. Вы можете обращаться в таком цикле и для вызовов неконстантных методов, то есть писать в объекты если нужно. Именно по этому я не стал сужать возможности и показал как есть.
Цитата Сообщение от Glbvnts Посмотреть сообщение
Разбираюсь в вашем коде, разобрался почти во всех строках.
Это приятно слышать. Теперь вы можете взглянуть в прошлое с ощущением прироста силы. Это приятное чувство)
1
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
22.05.2020, 01:20  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
(*it)->Name();
То есть, когда
Цитата Сообщение от Glbvnts Посмотреть сообщение
void allNames() {
        for (const auto& prtcl : particles) prtcl->Name();
    }
происходит что то такое?
C++
1
2
3
4
5
        auto begin{ &particles[0] };
        auto end{ begin + particles.size()};
        for (auto ptr = begin; ptr < end; ++ptr) {
            (*ptr)->Name();
        }
Цитата Сообщение от IGPIGP Посмотреть сообщение
Этот зверь не умеет копироваться.
читал, что он обладает таким свойством благодаря &, то есть это позволяет не создавать копии. не совсем понимаю копии чего?

Цитата Сообщение от Glbvnts Посмотреть сообщение
particles.reserve(alist.size());
здесь резервируется место(память???), но не выделяется память под указатели.

Здесь память под объкты частицы выделена
Цитата Сообщение от Glbvnts Посмотреть сообщение
std::initializer_list<std::unique_ptr<Pa rticle>> particlesList {
        std::unique_ptr<Particle>(new lightParticle),
        std::unique_ptr<Particle>(new heavyParticle),
    };
потом наша задача соеденить выделеную память, вытащив из списка инициализации ее адреса. тут бред

Цитата Сообщение от IGPIGP Посмотреть сообщение
Но для этого его надо попросить при помощи std::move.
unique_ptr полностью должен полностью владеть переданным ему объектом, поэтому этот указатель после перемещения
не будет владеть частицой(nullptr скорее всего). На чатицу у нас будет ссылка, как "ссылка r-value". Вы это имеете в виду?

Цитата Сообщение от Glbvnts Посмотреть сообщение
particles.push_back(std::move(const_cast <std::unique_ptr<Particle>&>(elem)));
когда elem успел стать сonst std::unique_ptr<Particle>& ? я таким вопросом задаюсь, потому что const_cast убирает у исходного типа спецификатор сonst или он вовсе не для этого там? По константной ссылке передается список инициализаторов, но константен сам список, а не элементы в нем.

Цитата Сообщение от Glbvnts Посмотреть сообщение
for (auto& elem : alist) {
этот код можно читать так
на каждой итерации elem будет присвоено значение из контейнера(не знаю можно ли называть так объекты класса initialize_list)? Мне все еще не ясно, что значит & перед elem?

Добавлено через 7 минут
это значит, что тип который будет выведен вместо auto компилятором, который в свою очередь узнает тип по типу инициализатора будет ссылочным, как это понимать умный указатель ссылочного типа?

Добавлено через 3 минуты
C++
1
for (auto& elem : alist) {
если убрать & то компилятор выдаст такое


error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Particle; _Dp = std::default_delete<Particle>]’
for (auto elem : alist) {
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.05.2020, 01:20
Помогаю со студенческими работами здесь

Из трех наследуемых классов получить массив родителя
Всем мира! Не один раз вы меня выручали, помогите, пожалуйста и в этот раз. Расту. И вопросы становятся глобальней. В общем, нашел такую...

Массив указателей на объекты
Доброго времени суток. В моем коде базовый класс имеет два наследника. Четвертый класс содержит динамический массив указателей на...

Динамический массив указателей на объекты
вообщем была тут на форуме задача, в подробности вдаваться не буду, смысл сейчас заключается в том, чтобы создавать в цикле объекты, и в их...

Массив указателей на объекты подклассов
Доброго времени суток всем!!! Проф задал написать парсер простых математических выражений с использованием скобок. Код не должен...

Динамический массив указателей на объекты класса
Добрый вечер! Нужна помощь У меня имеется класс STROKA(вроде уже готовый,и все хорошо) Только вот никак не могу понять, как создать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru