首页 > 解决方案 > 如何制作构造函数的深层副本

问题描述

我有以下构造函数:

在 HPP 文件中

Card(string name, int mana_cost, CardType type);

在 CPP 文件中

Oop::Card::Card(string name, int mana_cost, CardType type)
                : name_(name), mana_cost_(mana_cost), type_(type)
{

}

并想制作上面那个的复制构造函数,我试过了

  Card( const Card &b)
  {
    name_ = new std::string();
    *name_ = *b.name_;
    mana_cost_ = new int();
    type_ = new CardType();
  }

但无济于事

我怎么能做一个复制构造函数

提前致谢

标签: c++constructorcopy-constructor

解决方案


您的转换构造函数没有new类成员,因此您的复制构造函数也不需要new它们。只需以与转换构造函数相同的方式初始化复制构造函数中的成员,只需使用从传递的Card对象中获取的输入值,例如:

Oop::Card::Card(const Card &b)
    : name_(b.name_), mana_cost_(b.mana_cost_), type_(b.type_)
{
}

在 C++11 及更高版本中,您甚至可以将一个构造函数委托给另一个构造函数:

Oop::Card::Card(const Card &b)
    : Card(b.name_, b.mana_cost_, b.type_)
{
}

或者,最简单的解决方案是只default使用复制构造函数并让编译器为您处理复制,因为您的成员正在使用支持正确复制语义的类型:

class Card {
public:
    Card(string name, int mana_cost, CardType type);
    Card(const Card &) = default; // <--
};

推荐阅读