繁体   English   中英

指向对象作为“现代C ++”中的类成员的指针

[英]Pointers to object as class member in “modern C++”

因此,我听说过有关现代C ++风格的一条经验法则是,不必使用new或delete,而应该使用智能指针。 因此,当我拥有一个其中成员之一是指向另一个对象的指针的类时,该如何处理。 通过使用智能指针,可以避免删除操作,但是仍然需要使用new创建对象。 例如下面的“规范”现代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;
}

您使用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文档的“最佳实践”部分。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM