1

A、B、Cの3つのクラスがあるとします。AとBの両方がクラスCへのポインタを所有しています。クラスAの2つのインスタンスがオブジェクトCへの同じポインタを共有することは決してありませんが、同時に、オブジェクトCは、クラスBのインスタンスによって自由に指定できます。

これをc++(11)で実装する方法はありますか?

======編集======

では、詳しく見ていきましょう。オブジェクトを作成するとき、CIはオブジェクトBのコンテナーにポインターを追加します。オブジェクトAはCへのポインターを所有しているかどうかはわかりません。重要なのは、ユーザーのミスが原因で実際​​に発生する可能性のある同じCを指しているAは1つだけであるということです。Aが先験的にCを指していると、それは一生そのCを指し続ける必要があります。

一意のポインターを探していたはずですが、Bのコンテナーにそれらのコピーが必要です。

4

2 に答える 2

1

同じポインタがの複数のインスタンスに割り当てられている場合に例外をスローしたいようですA

このソリューションでは、使用済みのポインターを追跡して、再割り当てを防ぐことができます。 スレッドセーフではありません...必要に応じて同期を追加するためにこれを変更する必要があります。

class A
{
  // The pointers used by all instances of A
  static std::set<C*> used_ptrs;

  // The pointer used by this instance of A
  C* the_c;

  // Sets the pointer if it is valid
  void set_c( C* c )
  {
    if ( the_c )
      throw std::runtime_error( "C pointer is already set in this A" );

    if ( used_ptrs.count( c ) )
      throw std::runtime_error( "C pointer is already set in another A" );

    the_c = c;
    used_ptrs.insert( c );
  }

  // The pointer is presumed to be unassigned at construction
  A() : the_c(NULL) {}

  // The pointer is removed from the set at destruction
  ~A()
  {
    if( the_c );
      used_ptrs.erase( the_c );
  }

  // Copying A is invalid by your description
  A( const A& ) = delete;
  A& operator= ( const A& ) = delete;
}
于 2013-03-18T15:48:50.887 に答える
0

unordered_mapおそらく静的メンバーを使用して、クラスの内部で少し簿記をする必要があると思います。私は以下のコードが機能することをテストしました:

using namespace std;

struct C;

struct A
{
  void SetPointerToC(C & aC)
  {
    if ( mAllC.find(&aC) != mAllC.end() )
      assert(false); // multiple instances of A should not point to the same C

    mAllC[&aC] = this;
    mC = &aC;
  }

  ~A()
  {
    mAllC.erase(mC);
  }

private:

  // A is not copyable as to prevent multiple A instances having 
  // mC with the same value
  A(const A &);
  A & operator=(const A &);

  static unordered_map<C*, A*> mAllC;
  C * mC;
};

unordered_map<C*, A*> A::mAllC;

struct C
{

};

int _tmain(int argc, _TCHAR* argv[])
{
  A a;    
  A a2;
  C c;
  a.SetPointerToC(c); // works
  a2.SetPointerToC(c); // assert!

  return 0;
}
于 2013-03-18T15:48:41.073 に答える