С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
3 / 3 / 1
Регистрация: 04.04.2018
Сообщений: 351

Shared_ptr как поле класса

23.04.2020, 13:45. Показов 2786. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как обратиться к полю типа shared_ptr? У меня не получается в деструкторе или в методе обратиться к shared_ptr полю например some->size; как в примере
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<memory>
 
using namespace std;
 
template<typename T>
class DLinkList {
    T data;
    static int size;
    static DLinkList<T>* p;
    shared_ptr<DLinkList<T> > some;
    shared_ptr<DLinkList<T> > some2;
public:
    DLinkList();
    ~DLinkList();
};
 
template<typename T>
DLinkList<T>::DLinkList()
    : data(0)
    , size(0)
    , some(make_shared<T>())
    , some2(new DLinkList<T>())
{
    cout << "Constr is here";
}
 
template<typename T>
DLinkList<T>::~DLinkList() {
 
    //some->size; как мне обратиться к size?
}
 
 
int main() {
    system("pause");
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2020, 13:45
Ответы с готовыми решениями:

Запрет shared_ptr быть наследником определённого класса
Добрый день, #include &lt;memory&gt; class A { }; class B : public A {

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив объектов класса из предыдущей лабы и в...

Инициализация экземпляра класса, как поле другого класса
Всем доброго времени суток ! Есть класс: class a{ public: a(int _type): type(_type) {} private: int type; }

17
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.04.2020, 13:51
Цитата Сообщение от dimmarvel Посмотреть сообщение
//some->size; как мне обратиться к size?
Цитата Сообщение от dimmarvel Посмотреть сообщение
static int size;

C++
1
2
3
4
5
6
template<typename T>
DLinkList<T>::~DLinkList() {
 
    std::cout << DLinkList::size << '\n';
 
}
1
фрилансер
 Аватар для Алексей1153
6446 / 5642 / 1128
Регистрация: 11.10.2019
Сообщений: 15,009
23.04.2020, 14:12
Лучший ответ Сообщение было отмечено dimmarvel как решение

Решение

dimmarvel, size у тебя - статическое поле. Указатель тут ни при чём

Добавлено через 1 минуту
если было бы не статическое поле, то

C++
1
2
3
4
if(some)
{
   some->size;
}
1
3 / 3 / 1
Регистрация: 04.04.2018
Сообщений: 351
23.04.2020, 15:26  [ТС]
Алексей1153, а как обратиться к data через some?
0
фрилансер
 Аватар для Алексей1153
6446 / 5642 / 1128
Регистрация: 11.10.2019
Сообщений: 15,009
23.04.2020, 15:28
Лучший ответ Сообщение было отмечено dimmarvel как решение

Решение

dimmarvel,

C++
1
2
3
4
if(some)
{
   some->data;
}
1
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
23.04.2020, 17:05
Цитата Сообщение от Алексей1153 Посмотреть сообщение
если было бы не статическое поле
Это неверно. Данный синтаксис разрешен и для статических полей.
0
фрилансер
 Аватар для Алексей1153
6446 / 5642 / 1128
Регистрация: 11.10.2019
Сообщений: 15,009
23.04.2020, 17:14
ablex, можно обратиться, конечно
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
23.04.2020, 17:14
Цитата Сообщение от dimmarvel Посмотреть сообщение
, some(make_shared<T>())
, some2(new DLinkList<T>())
У вас тут бесконечная рекурсия. Чего вы этим кодом хотели добиться?
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.04.2020, 17:20
Цитата Сообщение от ablex Посмотреть сообщение
У вас тут бесконечная рекурсия. Чего вы этим кодом хотели добиться?
ablex, оно не должно компилироваться из-за самоопределения, вы правы. dimmarvel, что скажете?
1
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
23.04.2020, 17:26
Цитата Сообщение от IGPIGP Посмотреть сообщение
оно не должно компилироваться из-за самоопределения
Оно компилируется, если исправить ошибку в make_shared, но приводит к бесконечной рекурсии.
0
фрилансер
 Аватар для Алексей1153
6446 / 5642 / 1128
Регистрация: 11.10.2019
Сообщений: 15,009
23.04.2020, 17:41
вот так не упадёт
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
template<typename T>
class DLinkList {
    static int size;
    T data;
    std::shared_ptr<DLinkList > some;
    std::shared_ptr<DLinkList > some2;
public:
    DLinkList()
        : data(0)
        //, some(std::make_shared<DLinkList>())
        //, some2(new DLinkList())
 
    {
    }
 
    ~DLinkList()
    {
    }
};
 
template<typename T>
int DLinkList<T>::size=0;
 
 
DLinkList<int> list;


осталось только понять, зачем тут статический size

Добавлено через 1 минуту
а, пропустил static DLinkList<T>* p;

видимо, это для него. Заменяем на

C++
1
static std::vector<DLinkList*>
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename T>
class DLinkList
{
    static std::vector<DLinkList*> vec;
    T data{};
    std::shared_ptr<DLinkList > some;
    std::shared_ptr<DLinkList > some2;
public:
    DLinkList()
    {
    }
 
    ~DLinkList()
    {
    }
};
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
23.04.2020, 17:46
Цитата Сообщение от dimmarvel Посмотреть сообщение
У меня не получается в деструкторе или в методе обратиться к shared_ptr полю например some->size; как в примере
Ничего не понял. Что значит "не получается"?

Пробуем

C++
1
2
3
4
template<typename T>
DLinkList<T>::~DLinkList() {
    int t = some->size;
}
Все прекрасно получается.

У вас в конструкторе написана чушь, но ваш вопрос ведь про деструктор, так? Так о чем речь вообще?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.04.2020, 18:06
Цитата Сообщение от ablex Посмотреть сообщение
Оно компилируется, если исправить ошибку в make_shared, но приводит к бесконечной рекурсии.
Не верится. Там же вызов конструктора в кнструкторе... Имеете ввиду что run-time stack_overflow ? Будет время позже - попробую)

Добавлено через 2 минуты
dimmarvel, вы что самописных списков не писали? Как татк получилось, что вы не знаете что указатель "на себя" нельзя инициализировать в конструкторе?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
23.04.2020, 18:08
Цитата Сообщение от IGPIGP Посмотреть сообщение
оно не должно компилироваться из-за самоопределения,
Из-за какого еще "самоопределения"?

Оно не должно компилироватсья из-за size(0) в конструкторе (со статическими полями так, разумеется, нельзя) и из-за some(make_shared<T>()) (несоответствие типов).

А вот some2(new DLinkList<T>()) - формально корректно, но бесконечная рекурсия, как правильно было сказано выше.

Цитата Сообщение от IGPIGP Посмотреть сообщение
указатель "на себя" нельзя инициализировать в конструкторе
???
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
23.04.2020, 21:59
Цитата Сообщение от IGPIGP Посмотреть сообщение
Там же вызов конструктора в кнструкторе...
Чем это отличается от вызова функции в функции? Т.е., иными словами, от рекурсии, а я об этом и говорю. Вопросы веры оставьте религиям. Вы вполне могли бы проверить мое утверждение в любом доступном компиляторе.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.04.2020, 22:18
Цитата Сообщение от ablex Посмотреть сообщение
Чем это отличается от вызова функции в функции? Т.е., иными словами, от рекурсии, а я об этом и говорю.
Я это и подтвердил.
Цитата Сообщение от ablex Посмотреть сообщение
Вопросы веры оставьте религиям.
Вера нужна не только религиям. Что и кому оставить решу сам. Похоже я нашел ещё одного "друга". Постараюсь запомнить чтобы не реагировать больше.
Цитата Сообщение от ablex Посмотреть сообщение
Вы вполне могли бы проверить мое утверждение в любом доступном компиляторе.
И тут вы не отлавлиеваете смысл слов. Вот:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Будет время позже - попробую)
Это о компиляторе. Ну да ладно. Не стану вас более обременять. Удачи.
0
3 / 3 / 1
Регистрация: 04.04.2018
Сообщений: 351
24.04.2020, 15:00  [ТС]
IGPIGP, я просто пытался познакомится с умными указателями и пробовал всякие идеи которые приходили в голову, т.е. код этот не нужно принимать в серьез)
Просто когда я пишу object-> визуалка автоматически подсвечивает мне переменные к которым я могу обратиться через этот объект, а в случае с shared_pointer как раз вот не подсвечивал и я подумал что я что-то не так делаю и к экземпляру класса типа shared_ptr нельзя обратиться, после создал обычный указатель и у меня всё подсвечивалось, впрочем как и всегда, я решил спросить почему я не могу обратиться к полю класса тк подумал что, как я говорил, к нему нельзя обратиться
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.04.2020, 16:33
Цитата Сообщение от dimmarvel Посмотреть сообщение
IGPIGP, я просто пытался познакомится с умными указателями и пробовал всякие идеи которые приходили в голову, т.е. код этот не нужно принимать в серьез)
Этого ни кто и не делает. Иначе на сайте не было бы долгожителей. Сердечно сосудистые - это не шутки ведь.
Цитата Сообщение от dimmarvel Посмотреть сообщение
Просто когда я пишу object-> визуалка автоматически подсвечивает мне переменные к которым я могу обратиться через этот объект, а в случае с shared_pointer как раз вот не подсвечивал
intellicense это фича среды разработки (IDE) и является ещё менее серьёзной вещью чем shared_ptr
https://docs.microsoft.com/ru-... ew=vs-2019
Цитата Сообщение от dimmarvel Посмотреть сообщение
я подумал что я что-то не так делаю и к экземпляру класса типа shared_ptr нельзя обратиться
Надо было так и сказать. Вроде того, что попался ptr (зек -в русской аллитерации) который не отвечает когда вы к нему обращаетесь. Просто он shared - разделяем другими объектами, то есть. А с такими бывает всякое. А код... Я его не компилировал. С первого взгляда, увидел ошибку и написал. Вы думаете, если бы вы в конструкторе написали для обычных (тупо не мудрых) указателей, что-то вроде:
C++
1
2
3
DeadRecuringOne()
:familiar_ptr(new DeadRecuringOne())
{}
оно бы не стало бесконечно рекурсивно? Хотя можно:
C++
1
2
3
4
NotDeadRecuringOne()
:familiar_ptr(nullptr)
,self_ptr(this)
{}
А попытку инициализации статического члена в конструкторе я и не заметил. Тут вам бы разобраться нужно. У статических объектов жизненный цикл начинается раньше чем у объектов класса создаваемых в рантайме.
Один идиот считающийся супер-сеньйором, пытался доказать мне на собеседовании, что указатель на счётчик ссылок в shared_ptr можно реализовать как статическое поле. Но идиот он не поэтому. Просто натура у него такая. А про статическое поле и shared_ptr он потом сказал, что пошутил. Вот так.
Учить смарт пойнтеры не зная азов, это уже шутка. Потому что смешно. Потом, вопросы про обращение. Тоже не те что нужны на деле. Много смешного.
Соберитесь и постарайтесь шутить более осмысленно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.04.2020, 16:33
Помогаю со студенческими работами здесь

Вектор, как поле класса
Здравствуйте. Есть задание написать свой класс, который можно использовать как стек. Так вот помещаемые данные хранить, по-моему, удобнее...

Массив как поле класса
Например, имеется класс с полем массивом размерностью 10 на 10. class massiv { private: int mas; public: ... }; ...

Дерево как поле класса
Здравствуйте, у меня есть класс с несколькими полями, например, class Person { public: string name; int year; string adress; ...

Как вводить поле класса?
Почему возникает ошибка? Я пробовал scnf,scanf_s,gets,gets_s,cin,(cin&gt;&gt;z).get(); Что не так? #include &lt;iostream&gt; using...

Класс как поле класса
Нужно поместить класс внутри класса. Примерно так #include &lt;iostream.h&gt; #include &lt;conio.h&gt; // program.hpp class TPoint { ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru