1

データを共有したいときは、C ++でoperator[](const size_t&i)を使用すると混乱することがよくあります。使用すべきデザインパターンがあるかどうか、またはもっと良い方法があるかどうかを尋ねたかったのです。

複雑なベクトルコンテナを作成すると、私の問題がわかります。ただし、他のコンテナの作成でも同様の問題が発生しました。

これは私が書きたいコードです:

class complex; //forward declaration to my complex number container.

//my complex vector container 
class cvec{
    private:
      size_t m_size;  //The number of complex numbers in the vector
      /* I want my data stored 
       * real(0), imag(0), real(1), imag(1) ... real(m_size-1), imag(m_size-1) 
       * so that I can easily pass the data to blas routines - for example.
       */
      double* m_data;  // 2 * m_size
    public:
      //return a reference to constant complex number
      const complex& operator[](const size_t& i) const;  
      //return a reference to a complex number that points to m_data.
      //The user should be able to alter m_data by altering the returned complex number
      complex& operator[](const size_t& i);             
}

それは私のものを正確に反映していますclass vec(これは単なるdoubleの配列です)。

私の問題は、データがこのように共有されているときに、複素数への参照を適切な方法で管理する方法です。

私が今それをしている方法は醜い感じがします。複雑なクラスを次のように定義します。

class complex{
  private:
    double* m_data; //a pointer that always contains 2 elements
    bool    m_own;  //whether this class owns the data - or whether the data belongs to cvec
    void alloc_data(); //allocate the memory if m_own == true
  public:
    //A constructor when the complex number owns its data.
    complex(const double& x, const double& y) : m_own(true)
    { alloc_data(); m_data[0] = x; m_data[1]=y;}

    //A constructor when it does not
    complex(double* data) : m_own(false)
    { m_data = data;}

}

そして、cvecクラスで、std::vectorコンテナに一連の参照を追加します。

 class cvec{ 
 private:    
   ...  
   std::vector<boost::shared_ptr<complex> > m_complex_data;   
   void alloc_data() {  //I use calloc as I believe this is byte aligned while the new operator is not...
     if (m_size>0)
       m_data =  ( double* )  calloc(2*m_size, sizeof(double));

     m_complex_data.resize(m_size);
     for(size_t i=0;i<m_size;++i){
       //Pass a pointer to data to the new complex class
       boost::shared_ptr<complex> cptr(  new complex(m_data + 2*i) );
       m_complex_data[i] =  cptr ;
     }   
   } 
 public:   
   //Return the reference   
   const complex&
   operator[](const size_t& i) const
   {return *m_complex_data[i];}   
 }

これは機能しますが、かなり不安定に感じます。クラス間でデータを共有したいときに、参照を管理するためのより良い方法があるかどうかを尋ねたいと思いました。このようにデータを共有するときに使用すべきデザインパターンはありますか?

トム、ありがとう

4

0 に答える 0