【问题标题】:Copy Constructor with No Arguments没有参数的复制构造函数
【发布时间】:2012-07-04 09:26:47
【问题描述】:

写了这个小类,每次创建这个类的对象时都会生成一个UUID。

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>    

class myClass {

public:

    boost::uuids::uuid GetUUID();

    virtual ~myClass();

    myClass() {   // constructor
        mId = boost::uuids::random_generator()();
        std::cout<< "object created with uuid " << mId <<std::endl;
    }

private:

    boost::uuids::uuid mId;

}

在某些时候,我将这些对象推送到一个向量,并使用简单的赋值运算符将该向量与另一个向量相等。为了确保新向量中的对象不会生成新的 UUID,我想编写一个复制构造函数。但正如您所见,构造函数不需要参数。所以我不确定如何编写复制构造函数。此外,如果我有多个变量而不是一个 UUID,我该如何处理这种情况?

【问题讨论】:

  • 您正在使用赋值运算符进行比较?或者equating 是什么意思? constructor needs to arguments 是指two 参数还是no 参数?
  • 对错误感到抱歉。我已经更正了。

标签: c++ copy-constructor


【解决方案1】:

您需要以下签名:

 myClass(const myClass& other)
 {
     mId = other.mId;
 }

还有赋值运算符

 myClass& operator=(const myClass& other)
 {
     mId = other.mId;
     return *this;
 }

请注意,如果您不实现这些,编译器生成的将执行浅拷贝,因此不会生成新的 UUID。但是你应该让它们遵守三规则(毕竟你确实有一个析构函数)。

【讨论】:

  • 他的析构函数只被声明为virtual,所以它不会强加其他两个。 (另一方面:virtual 析构函数意味着该类应该是多态的,因此可能不支持赋值和复制。)
  • @JamesKanze 我更喜欢始终实现所有这三个,即使只是明确声明它们不存在并不是疏忽。
  • 在我自己的代码中,如果类有虚析构函数,那么它被设计为用作基类,通常不支持复制和赋值。今天通过从boost::noncopyable 继承来完成,在这种情况下,我不提供复制构造函数或赋值运算符。在他的情况下,因为他正在谈论将对象放入容器中......他应该放弃虚拟析构函数,因为它们不能是多态的,或者他应该重新考虑他的设计,可能使用指针容器。
  • @JamesKanze 我怀疑这是确切的代码。他甚至没有声明显然存在的mId
【解决方案2】:

编译器将为您生成一个复制构造函数和一个赋值运算符。如果此操作唯一要做的就是复制所有成员,那么编译器生成的操作将完全执行此操作。如果不是,复制构造函数的签名是:

myClass( const myClass& other )

作业的签名是:

myClass& operator=( const myClass& other )

亲切的问候

托尔斯滕

【讨论】:

    【解决方案3】:

    在这种情况下,编译器生成的默认复制构造函数和赋值运算符应该符合你的预期,所以你不需要显式定义它。

    【讨论】:

      猜你喜欢
      • 2021-05-31
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多