我有两个指向全局声明的 A 类的指针
A* a;
A* b;
int main(){
a = new A(...);
}
我应该如何调用复制构造函数以使 b 作为 a 的 BY VALUE 复制。A 类没有任何指针作为字段。
我确实声明了一个构造函数,但我可以删除它以免覆盖默认构造函数。
谢谢
我有两个指向全局声明的 A 类的指针
A* a;
A* b;
int main(){
a = new A(...);
}
我应该如何调用复制构造函数以使 b 作为 a 的 BY VALUE 复制。A 类没有任何指针作为字段。
我确实声明了一个构造函数,但我可以删除它以免覆盖默认构造函数。
谢谢
您的代码有两个问题,需要在回答问题之前修复。
unique_ptr
或者只是使用普通对象(除非该对象应该比 寿命更长main()
,但那是一个奇怪的案例)。因此,在更正代码后,它看起来像这样:
int main()
{
A a;
A b(a);
}
如果您需要从代码的其他部分访问这些对象,而不是显式地传递它们,请将它们放在明智的命名中namespace
:
// in header
namespace a_and_b // this is *wrong* name for it, of course
{
extern A a;
extern A b;
}
// in one of TUs - also possible to wrap this in namespace ... { ... }
A a_and_b::a;
A a_and_b::b(a_and_b::a);
当然,如果您只是询问语法,答案将是:
A * b = new A(*a);
所以只需取消引用指针即可A
退出A *
. 但是请永远不要这样做——即使在独立环境中,您也可以轻松实现自己的智能指针以理智的方式包装它。
只需使用 new 调用复制构造函数:
b = new A(*a);
不过我得问...为什么不保留两个静态对象呢?
如果你不声明一个,你总是会得到一个隐式构造函数、复制构造函数和析构函数,你可以像 StoryTeller 所说的那样调用它们;
b = new A(*a);
如果你想在复制构造函数中做任何事情,你需要编写一个,这里有一些关于你如何做到这一点:http ://www.cplusplus.com/articles/y8hv0pDG/