c++:指向在构造函数中创建的 class 实例的指针
c++ : pointer to a class instance created in constructor
首先,对于糟糕的标题感到抱歉......我真的不知道如何用一个来表达
sentance what I mean...欢迎您编辑标题。
我有三个 classes 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));
class A
为 B
实例化了两次(两次创建构造函数调用)。
C::a_ptr_
有问题。如果我这样做:
B b;
C C;
{
A a(1.0);
b.set(a);
c.set(a);
}
我在括号外也有同样的问题
我想找到一种方法将指针存储在 A
到 B
或 C
中而不用
复制 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
,你将无法避免复制它。此外,在这种情况下,您无法安全地获取此变量的地址。
首先,对于糟糕的标题感到抱歉......我真的不知道如何用一个来表达 sentance what I mean...欢迎您编辑标题。
我有三个 classes 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));
class A
为 B
实例化了两次(两次创建构造函数调用)。
C::a_ptr_
有问题。如果我这样做:
B b;
C C;
{
A a(1.0);
b.set(a);
c.set(a);
}
我在括号外也有同样的问题
我想找到一种方法将指针存储在 A
到 B
或 C
中而不用
复制 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
,你将无法避免复制它。此外,在这种情况下,您无法安全地获取此变量的地址。