c ++:指向在构造函数中创建的类实例的指针

时间:2015-02-17 07:56:08

标签: c++ class pointers

首先,对于糟糕的头衔感到抱歉......我真的不知道如何用一个表达 sentance我的意思...你是编辑标题的人。

我有三个课程ABC

class A{
    public:
        A(double a):a_(a){}
    private:
        double a_;
}

class B{
    public
        B():a_ptr_(NULL){}
        B(A const& a):a_ptr_(new A(a)){}
        ~B(){ delete a_ptr_; }
        void set(A const& a){ a_ptr_ = new A(a); }

    private:
        A*  a_ptr_;
}

class C{
    public
        C():a_ptr_(NULL){}
        C(A const& a):a_ptr_(&a){}
        void set(A const& a){ a_ptr_ = &a; }

    private:
        A*  a_ptr_;
}

我的问题是,如果我这样做

B b(A(1.0));
C c(A(1.0));

AB实例化两次(两次创建构造函数调用)。 C::a_ptr_有问题。如果我这样做:

B b;
C C;
{   
    A a(1.0);
    b.set(a);
    c.set(a);
}

我在括号外面遇到同样的问题。

我想找到一种方法,将指针存储在AB的{​​{1}}上 复制类C太多次而没有未定义的指针。

我发现了A构造函数,但我从未使用过这样的东西。 任何的想法 ?谢谢!

1 个答案:

答案 0 :(得分:0)

std::shared_ptr正是您所需要的。该类用于在不同位置存储一个指针。在指向它的最后一个shared_ptr被销毁后,目标对象将被删除。由于要清除析构函数中的内存,因此您的类将获得A对象的所有权。你可以使用这样的东西:

class B{
    public
        B():a_ptr_(NULL){}
        B(A * a): a_ptr_(a){ }
        ~B(){}//don't need to do anything here. 
        void set(A * a){ a_ptr_.reset(a); }

    private:
        std::shared_ptr<A> a_ptr_;
}
<...>
class C should be written in a similar manner
<...>
A * a = new a(1.0);
B b(a);
C c(a)

现在,如果您想通过引用创建一个构造函数或set方法a,那么您将无法避免复制它。此外,在这种情况下,您无法安全地获取此变量的地址。