C++ 是否有必要使";=&引用;当我们将一个类的一个共享ptr分配给另一个类时,运算符?
我有一个类,其中有多个指针作为数据成员C++ 是否有必要使";=&引用;当我们将一个类的一个共享ptr分配给另一个类时,运算符?,c++,C++,我有一个类,其中有多个指针作为数据成员 Class A { int* a; int* b; int c; } std::shared_ptr<A> Aa = std::make_shared<A>(); std::shared_ptr<A> Ab = std::make_shared<A>(); Ab = Aa; A类 { int*a; int*b; INTC; } std::shared_ptr Aa=std::make
Class A
{
int* a;
int* b;
int c;
}
std::shared_ptr<A> Aa = std::make_shared<A>();
std::shared_ptr<A> Ab = std::make_shared<A>();
Ab = Aa;
A类
{
int*a;
int*b;
INTC;
}
std::shared_ptr Aa=std::make_shared();
std::shared_ptr Ab=std::make_shared();
Ab=Aa;
假设所有“Aa”数据成员(以及指针)都是用一些数据初始化的
我可以直接完成上述共享ptr任务吗?
还是需要重载赋值运算符?
请帮助..
std::shared_ptr
只是一个智能指针,它不关心它所持有的对象的成员,只关心对象本身
将Aa
分配给Bb
将销毁Bb
持有的A
对象,然后共享Aa
持有的A
对象的所有权
重载operator=
与是否使用std::shared\u ptr
无关。无论A
对象是如何创建的,或者它的生命周期是如何管理的,A
都负责管理它自己的成员,方法是遵循
如果一个类需要一个用户定义的析构函数、一个用户定义的复制构造函数或一个用户定义的复制赋值操作符,那么它几乎肯定需要这三个操作符
由于存在用户定义的析构函数、复制构造函数或复制赋值运算符会阻止移动构造函数和移动赋值运算符的隐式定义,因此需要移动语义的任何类都必须声明所有五个特殊成员函数
如果A
的成员引用了A
负责释放/释放的外部数据/资源,则A
需要实现适当的构造函数、析构函数和赋值操作符来正确管理这些成员
如图所示,您的A
类可能违反了3/5/0规则,但很难说清楚,因为您没有说明如何使用数据初始化成员
例如,这将是一种违反,因为a
没有析构函数来释放它所拥有的new
'edint
s:
A类
{
公众:
int*a;
int*b;
INTC;
};
B类:公共A
{
};
std::shared_ptr Aa=std::make_shared();
a->a=新整数(123);
a->b=新整数(456);
a->c=7890;
std::shared_ptr Bb=std::make_shared();
Bb=Aa;
鉴于a
不拥有它所指向的int
s,因此这不会违反规定:
A类
{
公众:
int*a;
int*b;
INTC;
};
B类:公共A
{
};
INTA=123;
int b=456;
std::shared_ptr Aa=std::make_shared();
a->a=&a;
a->b=&b;
a->c=7890;
std::shared_ptr Bb=std::make_shared();
Bb=Aa;
假设A
负责为int
s分配内存,3/5/0实现的一致性规则可能更像这样:
A类
{
公众:
std::唯一的ptr a;
std::唯一的ptr b;
int c=0;
A()=默认值;
A(常数A和src):
a(std::make_unique(*src.a)),
b(标准::使_唯一(*src.b)),
c(src.c)
{
}
A(A&&src):
a(标准::移动(src.a)),
b(标准::移动(src.b)),
c(src.c)
{
src.c=0;
}
virtual~A()=默认值;
A运算符=(A右侧)
{
标准:掉期(a,rhs.a);
标准:掉期(b,rhs.b);
标准:互换(c,rhs.c);
归还*这个;
}
};
B类:公共A
{
};
std::shared_ptr Aa=std::make_shared();
a->a=std::使_唯一(123);
a->b=std::使_唯一(456);
a->c=7890;
std::shared_ptr Bb=std::make_shared();
Bb=Aa;
以所示的方式将一个共享指针分配给另一个共享指针并不涉及在类a
上调用复制构造函数,因此不需要定义它
std::shared_ptr<A> Aa = std::make_shared<A>();
std::shared_ptr<A> Bb = std::make_shared<B>();
Bb = Aa; // Copy assignment for shared_ptr (you now have two pointers to the same data)
<>但是你应该考虑如果你正在用对象切片创建问题:
什么是
B
?它是否继承自A
?如果类确实需要赋值运算符,为了安全起见,您应该有一个赋值运算符(以及一个复制构造函数和析构函数来完成赋值)。让一个程序因意外复制而出轨真糟糕。你的B类定义是什么?class
根本无法编译。很抱歉造成混淆,这里只有一个a类。两个共享指针(Aa和Ab)都属于相同的类类型。我已经相应地编辑了代码。
std::shared_ptr<A> Aa = std::make_shared<A>();
std::shared_ptr<A> Bb = std::make_shared<B>();
*Bb = *Aa;