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

c++ : pointer to a class instance created in constructor

首先,对于糟糕的标题感到抱歉......我真的不知道如何用一个来表达 sentance what I mean...欢迎您编辑标题。

我有三个 classes A, BC.

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));

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

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

我在括号外也有同样的问题

我想找到一种方法将指针存储在 ABC 中而不用 复制 class A 太多次并且没有未定义的指针。

我找到了带有 move 构造函数的东西,但我从未使用过。 任何的想法 ?谢谢!

std::shared_ptr 正是您所需要的。这个class是用来存放一个指针在不同的地方。目标对象将在最后一个指向它的 shared_ptr 被销毁后被删除。由于您正在清除析构函数中的内存,因此您的 classes 获得了 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,你将无法避免复制它。此外,在这种情况下,您无法安全地获取此变量的地址。