Указатели на объект как член класса в "современном C ++" - PullRequest
1 голос
/ 25 августа 2011

Итак, одно практическое правило, которое я слышал в отношении современного стиля C ++, заключается в том, что не нужно использовать новый или удалять, а вместо этого следует использовать умные указатели.Итак, как это сделать, когда у меня есть класс, где один из членов является указателем на другой объект.Используя умный указатель, я могу избежать необходимости удалять, но мне все еще нужно создать объект с новым.Например, приведенный ниже «канонический» современный стиль C ++, или как это сделать?


#include 
#include 

class B {
public:
    B () { std::printf("constructing B\n");}
    ~B () { std::printf("destroying B\n");}
};

class A {
public:
    A () 
    { 
        std::printf("constructing A\n");
        b = std::unique_ptr(new B());
    }
    ~A () { std::printf("destroying A\n");}

private:
    std::unique_ptr b;
};

int main()
{
    A a;
    return 0;
}


1 Ответ

7 голосов
/ 25 августа 2011

Вы используете new.Нет ничего плохого в использовании new, его следует использовать как можно реже.

(delete, с другой стороны, почти никогда не следует использовать, так как его использование должно всегда быть инкапсулированным в некоторый дескриптор RAII, такой как интеллектуальный указатель или контейнер.)


Обратите внимание, что при использовании интеллектуальных указателей вы всегда должны присваивать результат new именованному интеллектуальному указателю илииспользуйте reset.В вашем случае вы хотели бы использовать:

A() : b(new B()) { }

или:

A()
{
    std::unique_ptr<B> x(new B());
    b = std::move(x);
}

или:

A() { b.reset(new B()); }

(Почему это важно, см.раздел «Лучшие практики» boost::shared_ptr документации .)

...