1

我有两个指向全局声明的 A 类的指针

A* a;
A* b;

int main(){
     a = new A(...);           
}

我应该如何调用复制构造函数以使 b 作为 a 的 BY VALUE 复制。A 类没有任何指针作为字段。

我确实声明了一个构造函数,但我可以删除它以免覆盖默认构造函数。

谢谢

4

3 回答 3

4

您的代码有两个问题,需要在回答问题之前修复。

  1. 事实上,这些全局指针是全局的——在全局命名空间中有一些全局的东西,这是糟糕设计的标志(如果你的老师提倡它——因为它看起来有点像家庭作业——那么就打他的脸)。
  2. 这些全局指针是原始指针的事实——你要么想要将所有权保留在它们的位置,而不是传递所有权——那么你将使用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 *. 但是请永远不要这样做——即使在独立环境中,您也可以轻松实现自己的智能指针以理智的方式包装它。

于 2013-01-09T13:07:22.240 回答
3

只需使用 new 调用复制构造函数:

b = new A(*a);

不过我得问...为什么不保留两个静态对象呢?

于 2013-01-09T13:01:07.653 回答
1

如果你不声明一个,你总是会得到一个隐式构造函数、复制构造函数和析构函数,你可以像 StoryTeller 所说的那样调用它们;

b = new A(*a);

如果你想在复制构造函数中做任何事情,你需要编写一个,这里有一些关于你如何做到这一点:http ://www.cplusplus.com/articles/y8hv0pDG/

于 2013-01-09T13:06:55.107 回答