在没有用户定义的ctor的情况下,禁止显式复制数据成员

时间:2011-05-20 00:15:02

标签: c++ copy-constructor

我对复制构造函数/复制对象有疑问。

我有一个类,它有一些我不想被复制的属性。

class Action : public Cloneable<Action>
{
public:
     //Constructors and other methods are ommitted
    std::vector<BattleCharacter*> Users;
    std::vector<ActionTargetTuple> Targets;
protected:
    ActionType Type;
    std::string Name;
    int UID;
 }

我希望在制作此类对象的副本时不要复制UsersTargets向量。有没有办法将它们标记为显式不可复制而不使用自定义复制构造函数?如果没有,并且我使用自定义复制构造函数,我是否需要为从此继承的每个类定义自定义复制构造函数?

4 个答案:

答案 0 :(得分:4)

默认的复制构造函数将复制所有内容,因此是 - 您需要手动实现复制构造函数来实现此目的。由于这将替换默认的副本ctor,因此您不需要为每个继承的类定义一个(除非您需要不同的行为)。

答案 1 :(得分:0)

您需要定义复制构造函数,以便自定义复制的内容和不复制的内容。 幸运的是,通过这样做,你告诉编译器不要自动生成默认的复制构造函数,你的将取代它。因此,不必担心使用默认构造函数的派生类。

在您完成解决方案时,请考虑this design pattern

答案 2 :(得分:0)

您是否需要复制ctor来处理容器或返回物品?如果没有,您可以考虑创建另一种方法来进行复制。

答案 3 :(得分:0)

我同意上面的答案,最好提供复制构造函数和赋值运算符,但如果你不想因为某些原因(?)而改变用户和目标的类型,作为变体,使用shared_ptr,它将防止这些成员进行深层复制,例如:

typedef std::vector<BattleCharacter*> USERS;
typedef std::vector<ActionTargetTuple> TARGET;
....
boost::shared_ptr<USERS> Users;
boost::shared_ptr<TARGET> Target;

此外,现在shared_ptr是TR1的一部分,因此可以在不使用boost的情况下使用它。