1

クラスを作成するときに、そのクラスに配列を格納できるようにしたいと考えています。これは可能ですか?

例えば。メイン関数から配列を格納するための array というクラスがある場合

int main()
{
    double nums[3] = {1 2 3}
    array Vnums(nums) 
    return 0
}

class array
{
    public
    //constructor
        array(double nums[])
        {
            double vector[] = nums;
        }// end constructor
}// end array

ありがとうございました!

4

2 に答える 2

3

std::array生の配列の代わりに a を使用します。生の配列と同じですが、コピー可能で、便利なメンバー関数があります。

class array
{
    std::array<double, 3> classArray;
    public:
    //constructor
        explicit array(const std::array<double, 3>& rhs) 
        :classArray(rhs)
        {}// end constructor
}// end array


int main()
{
    std::array<double, 3> nums = {{1 2 3}};
    array Vnums(nums) 
    return 0
}

またはstd::vector、サイズを自由に変更できるようにしたい場合は、

class array
{
    std::vector<double> classArray;
    public:
    //constructor
        explicit array(const std::vector<double>& rhs) 
        :classArray(rhs)
        {}// end constructor
}// end array


int main()
{
    std::vector<double> nums{1 2 3}; //C++11 feature
    array Vnums(nums) 
    return 0
}

何をしているかわからないので、的確なアドバイスは難しいです。未加工の配列を参照、ポインターとカウント、イテレーターのペアで渡すことができます...

于 2012-11-07T16:51:27.220 に答える
2

はい。ただし、クラスの作成時に配列を動的に割り当てるか、配列を常に同じサイズにする必要があります。

オプション A:

class array{
private:
  double* data;
  unsigned size;
public:
  array(double* d, unsigned s){
    size = s;        
    data = new double[size];
    for(unsigned i = 0; i < s; i++) 
        data[i]=d[i];
  }
  array(const array& copy){
    double* temp = new double[copy.size];
    delete [] data;
    data = temp;
    size = copy.size;
    for(unsigned i = 0; i < size; i++) 
        temp[i]=copy.data[i];    
  }
  array& operator= (const array& copy){
    double* temp = new double[copy.size];
    delete [] data;
    data = temp;
    size = copy.size;
    for(unsigned i = 0; i < size; i++) data[i]=copy.data[i];
  }
  ~array(){
    delete[] data; // Don't forget the destructor!
  }
};

これはおそらく必要な方法ですが、このクラスの複数のインスタンス間でメモリを共有しないように、ほぼ確実にカスタム コピー コンストラクターと代入演算子が必要になることに注意してください。より良い方法は、両方が使用できるコピー機能を作成することです。

オプション B:

class array{
private:
  double data[3];
public:
  array(double* d){ //or "double(&d)[3]" to be safer, but less flexible
    for(unsigned i = 0; i < 3; i++){
      data[i] = d[i]; // If d is not at least size 3, your program will crash here (or later on, or maybe just act in an undefined way) 
    }
  }
}

これはテストしていませんが、出発点としては問題ありません。

于 2012-11-07T16:55:24.397 に答える