3

C ++でクラスのコピーを禁止したい場合、通常はプライベート演算子=コピーコンストラクターを宣言し、それらを実装しません。

class MyClass
{
  char* _str;
  int _len;
  MyClass(const MyClass& rhs);            //No implementation
  MyClass& operator=(const MyClass& rhs); //No implementation
public:
  MyClass();
  MyClass(const char *);
}

これは悪いスタイルと見なされますか?これを行う別の方法はありますか?

4

3 に答える 3

10

C ++ 11では、これらの関数を明示的に削除できます(より読みやすく、リンカーエラーだけでなく、常にコンパイラエラーが生成されるため、実装を省略するよりも優先されます)。

class MyClass
{
  char* _str;
  int _len;
  MyClass(const MyClass& rhs) = delete;
  MyClass& operator=(const MyClass& rhs) = delete;
public:
  MyClass();
  MyClass(const char *);
}

C ++ 03では、などの基本クラスを使用しboost::noncopyableて同じ効果を得ることができます。これはより読みやすいかもしれません(これは基本的にあなたと同じアプローチです-この基本クラスにはプライベートコピーコンストラクタと代入演算子があるので、それを継承するとクラスはコピーできなくなります):

class MyClass : boost::noncopyable
{
  char* _str;
  int _len;
public:
  MyClass();
  MyClass(const char *);
}

C ++での浅いコピーと深いコピーの違いは、完全にコピーコンストラクターの実装方法にあります(代入演算子はコピーコンストラクターを使用して実装する必要があるため)。持っていない場合は、浅いコピーも深いコピーもできません。持っている場合は、実装方法によって異なります。

于 2012-11-19T15:11:08.170 に答える
3

同じことを実現するためにプリプロセッサマクロを作成できます。

#define DISABLE_COPY_AND_ASSIGN(className) private: \
    className(const className&); \
    className& operator=(const className&);

次に、次のように使用します。

class MyClass
{
   DISABLE_COPY_AND_ASSIGN(MyClass)
public:
   ....
};

あなたもから派生することができますboost::noncopyable

class MyClass : boost::noncopyable
{
public:
   ....
};

さらに、C ++ 11では、次を使用できます= delete

MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
于 2012-11-19T15:13:46.783 に答える
2

2つの方法があり、どちらもコンパイルエラーを引き起こします。

C ++ 11の方法:

class MyClass
{
  char* _str;
  int _len;
  MyClass(const MyClass& rhs) = delete;
  MyClass& operator=(const MyClass& rhs); = delete
public:
  MyClass();
  MyClass(const char *);
};

C ++ 03の方法:

class MyClass
{
  char* _str;
  int _len;
public:
  MyClass();
  MyClass(const char *);

  MyClass(const MyClass& rhs);            //No implementation
  MyClass& operator=(const MyClass& rhs); //No implementation
}

コピーコンストラクターをpublicと宣言しただけでは、リンカーエラーが発生しますが、コンパイルは成功します。リンクする前にコンパイルが行われるため、エラーをより早くキャッ​​チできるため、コンパイルを中断する方が適切です。

于 2012-11-19T15:15:19.323 に答える