Используйте shared_ptr среди функций-членов в качестве закрытой переменной C ++ - PullRequest
0 голосов
/ 17 марта 2020

Я хотел бы повторно использовать shared_ptr среди нескольких функций-членов в классе.

#include <iostream>
#include <memory>

class TestClass
{
    private:
        std::shared_ptr<int> int_shared_ptr;

    public:
        TestClass()
        {
            std::cout << "I will create a shared ptr object here.";
            std::shared_ptr<int> int_ptr (new int(10));
            std::shared_ptr<int> int_shared_ptr(int_ptr);
            std::cout << "The created shared ptr has value of " << *int_shared_ptr << "\n";

        }

        void check_if_shared()
        {
            std::cout << "The created shared ptr has value of " <<  int_shared_ptr << "\n";
        }

};


int main(){

    auto tc = TestClass();
    tc.check_if_shared();


}

Вывод

I will create a shared ptr object here.The created shared ptr has value of 10
The created shared ptr has value of 0

int_shared_ptr кажется уничтоженным, как только он покидает конструктор. Может кто-нибудь предложить способ сохранить общий указатель после выхода из конструктора?

Ответы [ 2 ]

4 голосов
/ 17 марта 2020

Строка

std::shared_ptr<int> int_shared_ptr(int_ptr);

создает локальную переменную функции с тем же именем, что и переменная-член. Переменная-член остается инициализированной по умолчанию. Использование:

TestClass() : int_shared_ptr(new int(10))
{
    std::cout << "The created shared ptr has value of " << *int_shared_ptr << "\n";
}

Более логично c использовать std::make_shared:

TestClass() : int_shared_ptr(std::make_shared<int>(10))
{
    std::cout << "The created shared ptr has value of " << *int_shared_ptr << "\n";
}
0 голосов
/ 17 марта 2020

Так что я думаю, что вы пытаетесь сохранить ссылку на один и тот же int с несколькими общими указателями - членами экземпляра. Как насчет этого простого решения:

#include <memory>

class TestClass
{
    private:
        // you can have any number of shared pointers here

        std::shared_ptr<int> shared_0;
        std::shared_ptr<int> shared_1;
        std::shared_ptr<int> shared_2;

    public:
        TestClass()
        {
            // create new int once
            shared_0 = std::make_shared<int>(10);

            // copy references only
            shared_1 = shared_0;
            shared_2 = shared_0;

            std::cout << "shared_0: " << *shared_0 
                << "\nshared_1: " << *shared_1 
                << "\nshared_2: " << *shared_2 << "\n";
        }

        void check_if_shared()
        {
            std::cout << "shared_0: " << *shared_0 
                << "\nshared_1: " << *shared_1 
                << "\nshared_2: " << *shared_2 << "\n";
        }
};

int main()
{
    auto tc = TestClass();
    tc.check_if_shared();

    // now all shared pointers point to the same int
}

Вывод:

shared_0: 10
shared_1: 10
shared_2: 10
shared_0: 10
shared_1: 10
shared_2: 10
...