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

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

19.11.2016, 13:35. Просмотров 393. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2016, 13:35
Ответы с готовыми решениями:

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

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

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

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

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

1
monolit
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
19.11.2016, 13:41 2
shared_from_this:
http://en.cppreference.com/w/cpp/mem...ared_from_this

PS
А пример действительно слишком синтетический...
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2016, 13:41

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

Инициализация объектов класса в конструкторе другого класса
У меня есть класс Subscriber,в котором есть несколько объектов другого класса Date,мне нужно,чтобы...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая...


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

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

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