禁用复制构造函数

Disable copy constructor

本文关键字:构造函数 复制      更新时间:2023-10-16

我有一个类:

class SymbolIndexer {
protected:
  SymbolIndexer ( ) { }
public:
  static inline SymbolIndexer & GetUniqueInstance ( ) 
  { 
    static SymbolIndexer uniqueinstance_ ;
    return uniqueinstance_ ; 
  }
};

我应该如何修改它以禁用以下代码:

SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );

并且只允许以下代码:

SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );

您可以将复制构造函数设为私有,并且不提供任何实现:

private:
    SymbolIndexer(const SymbolIndexer&);

或者在 C++11 中,明确禁止它:

SymbolIndexer(const SymbolIndexer&) = delete;

如果你不介意多重继承(毕竟还不错),你可以用私有复制构造函数和赋值运算符编写简单的类,并另外对其进行子类化:

class NonAssignable {
private:
    NonAssignable(NonAssignable const&);
    NonAssignable& operator=(NonAssignable const&);
public:
    NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};

对于 GCC,这会给出以下错误消息:

test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private

不过,我不太确定这是否适用于每个编译器。有一个相关的问题,但还没有答案。

上级:

在 C++11 中,您还可以编写NonAssignable类如下:

class NonAssignable {
public:
    NonAssignable(NonAssignable const&) = delete;
    NonAssignable& operator=(NonAssignable const&) = delete;
    NonAssignable() {}
};

delete 关键字可防止成员被默认构造,因此不能在派生类的默认构造成员中进一步使用它们。尝试分配会在 GCC 中出现以下错误:

test.cpp: error: use of deleted function
          ‘SymbolIndexer& SymbolIndexer::operator=(const SymbolIndexer&)’
test.cpp: note: ‘SymbolIndexer& SymbolIndexer::operator=(const SymbolIndexer&)’
          is implicitly deleted because the default definition would
          be ill-formed:

上级:

Boost 已经有一个用于相同目的的类,我想它甚至以类似的方式实现。该类称为 boost::noncopyable,旨在按如下方式使用:

#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};

如果您的项目策略允许,我建议您坚持使用 Boost 的解决方案。另请参阅另一个与boost::noncopyable相关的问题以获取更多信息。

SymbolIndexer( const SymbolIndexer& )设为私有。如果要指定引用,则不会复制。