3

TCPLを読んでいると、タイトルが示すように問題が発生し、「プライベート」クラスは次のようになります。

class Unique_handle {
private:
    Unique_handle& operator=(const Unique_handle &rhs);
    Unique_handle(const Unique_handle &rhs);
public:
    //...
};

使用コードは次のとおりです。

struct Y {
    //...
    Unique_handle obj;
};

そして、私はそのような操作を実行したい:

int main()
{
    Y y1;
    Y y2 = y1;
}

ただし、これらのコードはTCPLからのものですが、まだ解決策を得ることができません...誰か助けていただければ幸いです。

4

6 に答える 6

6

その名前が示すように、Unique_handleはコピーするためのものではありません。その実装では、コピー コンストラクターとコピー代入演算子を無効にすることでそれを保証します。

複数のインスタンスが a にアクセスするための 1 つの解決策は、Unique_handlea へのポインターを保持し、ポインターをコピーすることです。次に、 の複数のインスタンスがY同じ一意のハンドルを指します。

ただし、この場合、リソースを適切に管理するように注意してください。

于 2010-06-05T05:00:49.730 に答える
4

Stroustrupの本で見ている例は、クラスの設計者がそのクラスのオブジェクトのコピーまたは割り当てを明示的に防止する方法を示しています。

クラスは意図的に作成しているため、コードは実行しようとしていることを実行できません(おそらく、クラスが正しく機能しないか、コピーしても意味がないためです)。そのクラスのオブジェクトをコピーできるようにする場合は、クラスを再設計する必要があります。

あなたが持っているかもしれない他のいくつかのオプション(これも意味がないかもしれませんが、それはあなたが実際に何をしているかに依存します)-コピーする代わりにオブジェクトへの参照へのポインタを渡します。

于 2010-06-05T05:45:05.967 に答える
2

通常、コピー コンストラクターと代入演算子を非公開 (かつ未実装) にするイディオムは、クラスの元の作成者がこのオブジェクトをコピー可能にすることを明確に望んでいないことを意味します。

于 2010-06-05T05:01:30.743 に答える
2

コピーしようとしてはいけません。しかし、そうは言っても.... memcpyできます。あなたがそうする唯一の理由は、あなたが何をしているのか、結果などを知っているということです. しかし、あなたは何か少し忍者をしたいかもしれません.

于 2010-06-05T05:07:11.050 に答える
0

を使用しshared_ptrてオブジェクトを共有できます。

class Y
{
public:
  Y(): mHandle(new UniqueHandle()) {}

private:
  boost::shared_ptr<UniqueHandle> mHandle;
};

それはそれと同じくらい簡単です。

共有所有権が必要ない場合は、使用するboost::scoped_ptrか、アクセス権がある場合は新しく作成std::unique_ptrしたものを使用して、セマンティクスに注意しながら、CopyConstructorとAssignmentOperatorを自分で実装できます。

于 2010-06-05T10:17:59.057 に答える
0

私は自分の質問をグーグルで検索し、そのようなオブジェクトを構築する方法を見つけました:

static Unique_handle* instance() { return new Unique_handle(); }

しかし、それは間違っているようですが、どうすればそのようなオブジェクトを外部で定義できますか?

とにかく、心配してくれてありがとう。

于 2010-06-05T08:40:37.470 に答える