Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
5 / 5 / 5
Регистрация: 05.02.2013
Сообщений: 197
1

Указатель на this в конструкторе класса

19.11.2016, 13:35. Просмотров 773. Ответов 1

Добрый день!

Есть некий синтетический пример:

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <memory>
 
class B;
 
class A
{
public:
    explicit A(int nValue)
        : m_spB(std::make_shared<B>(this))
        , m_nValue(nValue)
    { }
 
    std::shared_ptr<B>m_spB;
    int m_nValue;
};
 
class B
{
public:
    explicit B(A* pA)
        : m_spA(pA)
    { }
 
    std::shared_ptr<A>m_spA;
};
 
int main(int argc, char* argv[])
{
    A a1(5);
    A a2(10);
 
    std::cout << a1.m_nValue << std::endl;
    std::cout << a2.m_nValue << std::endl << std::endl;
 
    std::cout << a1.m_spB->m_spA->m_nValue << std::endl;
    std::cout << a2.m_spB->m_spA->m_nValue << std::endl;
 
    return 0;
}


Подскажите пожалуйста насколько правильно передавать в конструкторе класса A, для инициализации shared_prt - this?
Компилировал с помощью gcc version 5.4.0 20160609 (ubuntu), работает вроде всё нормально.

Особенно интересует что произойдёт если в конструкторе класса A я кину exception? Произойдёт ли очистка памяти?

Ну и если такой подход - неправильный, то как можно изменить данный пример НЕ меняя архитектуру классов и т.п.

Спасибо!

Добавлено через 5 минут
Если немного модифицировать данный пример:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <memory>
 
class B;
 
class A
{
public:
    explicit A(int nValue)
        : m_spB(std::make_shared<B>(this))
        , m_nValue(nValue)
    {
        std::cout << "A()" << std::endl;
    }
 
    ~A()
    {
        std::cout << "~A()" << std::endl;
    }
 
    std::shared_ptr<B>m_spB;
    int m_nValue;
};
 
class B
{
public:
    explicit B(A* pA)
        : m_spA(pA)
    {
        std::cout << "B()" << std::endl;
    }
 
    ~B()
    {
        std::cout << "~B()" << std::endl;
    }
 
    std::shared_ptr<A>m_spA;
};
 
int main(int argc, char* argv[])
{
    A a1(5);
    A a2(10);
 
    std::cout << std::endl << a1.m_nValue << std::endl;
    std::cout << a2.m_nValue << std::endl << std::endl;
 
    std::cout << a1.m_spB->m_spA->m_nValue << std::endl;
    std::cout << a2.m_spB->m_spA->m_nValue << std::endl << std::endl;
 
    return 0;
}


Получаю следующий вывод:
B()
A()
B()
A()

5
10

5
10

~A()
~B()
~A()

С чем это может быть связанно?
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2016, 13:35
Ответы с готовыми решениями:

Как в конструкторе класса передать параметром указатель на функцию?
Друзья! Вот тут всё понятно, есть класс, в котором приватная функция f_0, в конструкторе...

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

Указатель this в конструкторе копирования
Добрый всем вечер. Подскажите пожалуйста, как правильно применить в конструкторе копирования...

Зачем передавать в конструкторе указатель
Привет, Зачем в конструкторе передавать указатель, например на QWidget, который равен нулю? Еще...

1
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
19.11.2016, 13:41 2
shared_from_this:
http://en.cppreference.com/w/c... _from_this

PS
А пример действительно слишком синтетический...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2016, 13:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

С++, delete в деструкторе класса не видит переменные, создаваемые new в конструкторе класса
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;math.h&quot; using namespace std; class fun {...

Ошибка при работе с объектом класса в конструкторе другого класса
Имеется данный код: https://github.com/ubelian/glgame/tree/master/glgame В файле Food.cpp в...

Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса?
Ну то есть так: есть родительский и дочерний класс, в родительском определен виртуальная функция и...

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.