복사 생성자 비활성화 return uniqueinstance_

수업이 있습니다.

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

그래도 이것이 모든 컴파일러에서 작동하는지는 확실하지 않습니다. 거기입니다 관련 질문은 , 아직 응답 없음으로.

UPD :

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:

UPD :

Boost는 이미 같은 목적을 위해 클래스를 가지고 있습니다. 클래스는 boost::noncopyable다음과 같이 호출 되고 사용됩니다.

#include <boost/core/noncopyable.hpp>

class SymbolIndexer: public Indexer, private boost::noncopyable {
};

프로젝트 정책에서 허용하는 경우 Boost의 솔루션을 고수하는 것이 좋습니다. 자세한 내용은 다른 boost::noncopyable관련 질문 을 참조하십시오.


답변

SymbolIndexer( const SymbolIndexer& )비공개로 만드십시오 . 참조에 할당하는 경우 복사하지 않은 것입니다.


답변