首先,对于糟糕的头衔感到抱歉......我真的不知道如何用一个表达 sentance我的意思...你是编辑标题的人。
我有三个课程A
,B
和C
。
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));
类A
为B
实例化两次(两次创建构造函数调用)。
C::a_ptr_
有问题。如果我这样做:
B b;
C C;
{
A a(1.0);
b.set(a);
c.set(a);
}
我在括号外面遇到同样的问题。
我想找到一种方法,将指针存储在A
或B
的{{1}}上
复制类C
太多次而没有未定义的指针。
我发现了A
构造函数,但我从未使用过这样的东西。
任何的想法 ?谢谢!
答案 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
,那么您将无法避免复制它。此外,在这种情况下,您无法安全地获取此变量的地址。