代码之家  ›  专栏  ›  技术社区  ›  Rob Cooke

分配C++类成员数据的首选方法是什么?

  •  3
  • Rob Cooke  · 技术社区  · 15 年前

    假设我有一个类分配了一些任意的成员数据。我见过两种常用的方法(我知道还有其他方法):

    class A
    {
        public:
            A();
            ~A();
    
            //Accessors...
        private:
            B *mB;
    }
    
    A::A()
    {
        mB = new B();
    }
    
    A::~A()
    {
        delete B;
    }
    

    对。。。

    class A
    {
        public:
            //Accessors...
        private:
            B mB;
    }
    

    假设A本身将由使用者代码在堆上分配。

    一般情况下,首选哪种方法?我意识到,特定的情况确实会鼓励这样或那样的方式,但在没有这些要求的情况下,有一种方式更可取吗?什么是权衡?

    4 回复  |  直到 15 年前
        1
  •  9
  •   JaredPar    15 年前

    第二条是首选路线。不要使用new/delete,除非您特别需要一个变量位于堆中或其生存期长于其容器。C++值类型更易于管理,错误案例更少,不必担心IMHO。

        2
  •  4
  •   Beta    15 年前

    一般来说,如果一个B是大而笨拙的,那么传递一个指向B的指针比传递B本身更容易。因此,如果B经常与A分离(如果A交换了B),那么第一种方法更好。

    使用指针还可以减少依赖性。如果你做对了, A.hh 可以通过没有具体说明B是什么或做什么(即。 A.h 不需要 #include "B.hh" )所以依赖于 不一定取决于 B.hh

    使用指针的代价是额外的一层机器和诸如丢失对象、双重删除和取消对未初始化指针的引用之类的危险,因此不应该使用指针,除非它在您的情况下确实提供了好处。有些人爱上了指针技术,并在任何地方使用它们;如果他们想作为程序员提高,他们必须从中成长出来。

        3
  •  0
  •   Mark B    15 年前

    如果要实现PIMPL,或者需要使用几种可能的类类型之一(通过继承),则可以使用第一个选项。在这种情况下,一定要使用智能指针( boost::shared_ptr 例如)为您管理内存。

        4
  •  0
  •   Community Mohan Dere    9 年前

    这主要取决于你在找什么。

    简单的缘故 :不要使用指针。因此第二个选择。

    它更易于管理(无需担心内存管理、深度复制、深度常量等)。

    • 如果您需要多态性(否则您将进行截断)
    • PIMPL here

    即使在这种情况下,也要将责任移交给智能管理器(智能指针、专用pimpl类等…)