0

やりたいこと: クラスを C++ の一種の「組み込み」配列として使用する方法を知りたいです (C も使用できます)。だから、基本的に私はこれを行うことができるようにしたい:

array1d rows(5); 
//an integer array of length 5 - iniatilized to 0 upon instantiation.
//rows can be imagined as this: [ 0, 0, 0, 0, 0 ]



array1d x(1), y(2), z(3);
array2d cols(3);
cols[0] = x;
cols[1] = y;
cols[2] = z;

//an array of array of integers [ [x] [y] [z] ]
//where x, y and z are of type array1d, so here is what it would like:
//if x = 1, y = 2, z = 3
//[ [0], [0, 0], [0, 0, 0] ]

array3d depth(2); 

//an array of array of array of integers [ [cols] [cols] ]
//where cols is of type array2d, so when expanded it would like:
//[ [ [0], [0, 0], [0, 0, 0] ]
//  [ [0], [0, 0], [0, 0, 0] ] ]

私がこれまでに持っているもの

using namespace std;

class array3d;
class array2d;

class array1d//works exactly the way i want it to 
{
    int len;
    int *data;
public:
    array1d (int size){
        data = new (nothrow) int[size];

        if (data != 0){
            len = size;

            for (int i = 0; i<len; i++){
                data[i] = -1;
            }
        }
    }

    ~array1d (){
        delete data;
    }


    void print(){
        for (int i = 0; i<len; i++){
                cout << data[i] << " ";
            }
        cout << endl;
    }


    int operator[] (int index){
        if (index >= 0 && index <= len){
            return data[index];
        }
    }


    friend class array2d;
};

class array2d//this is what needs changing
{
    int len;
    array1d *data;
public:
    array2d (int size_dim1, int size_dim2){
        data = new (nothrow) array1d[size_dim1]; //i think the problem is here

        if (data !=0){
            len = size_dim1;
            for (int i = 0; i < len; i++){
                data[i] = array1d(size_dim2);
            }
        }
    }
    ~array2d (){}

    void print(){
        for (int i = 0; i < len; i++){
            data[i].print();
        }
    }

    array1d operator[] (int index){
        return data[index];
    }

    friend class array3d;   
};

class array3d//dont even know how to get this one started
{
    array3d (int size_dim1, int size_dim2, int size_dim3){
             data = new (nothrow) array2d[size_dim2, size_dim3]; 

        if (data !=0){
        len = size_dim1;
            for (int i = 0; i < len; i++){
                data[i] = array2d(size_dim2, size_dim3);
            }
        }
            }
    ~array3d (){}
    //overload [] operator

private:
    int len;
    array2d *data;
};

また、別のクラスを追加するたびにカスタマイズする必要がないように、可能な4次元に対応するためにクラスを追加できるようにしたいと考えています。

4

3 に答える 3

0

異なるタイプのアイテムを配列に入れることはできません。しかし、あなたの場合、2d クラスには 1d クラスが含まれ、3d クラスには 2d クラスが含まれているため、次のようにすることができます。

class array1d
{
  // something
};

class array2d : public array1d
{
  // something
};

class array3d : public array2d
{
  // something
};

ポインタを配列に入れます。

array1d *arr[3];
arr[0] = new array1d;
arr[1] = new array2d;
arr[3] = new array3d;
于 2012-07-07T14:16:06.327 に答える
0

あなたのクラスはメモリ リーク ジェネレーターです... new を呼び出すたびに ... delete を呼び出す担当者を考えてください!

とは言っても、配列を動的 (実行時にサイズ変更) するか静的 (組み込みのように宣言時にサイズ変更) するかは明確ではありません。

この最後のケースでは、直観的なサンプルは次のようになります。

#include <iostream>

template<class T, size_t... Z>
class array; //not defined: just a varadic template forward

template<class T, size_t A>
class array<T,A> //simple case for 1D
{
public:
    array() :m() {}
    array(const T& a) :m(a) {}
    T& operator[](int i) { return m[i]; }
    const T& operator[](int i) const { return m[i]; }

private:
    T m[A];
};

template<class T, size_t A, size_t... Z>
class array<T,A,Z...> //case for multi Dim as 1D of Dim-1
{
public:
    array() :m() {}
    array<T,Z...>& operator[](int i) { return m[i]; }
    const array<T,Z...>& operator[](int i) const { return m[i]; }

private:
    array<T,Z...> m[A];
};


// generate output by recursion
template<class T, size_t A, size_t... N>
std::ostream& operator<<(std::ostream& s, const array<T,A,N...>& a)
{
    s << "[ ";
    for(size_t i=0; i<A; ++i)
    {
        if(i!=0) s<<", ";
        s << a[i];
    }
    s << "] ";
    return s;
}

//just declare, fill-up and output
int main()
{
    array<int, 3,3,3> a;
    for(size_t i=0; i<3; ++i)
        for(size_t j=0; j<3; ++j)
            for(size_t k=0; k<3; ++k)
                a[i][j][k] = 100 + 100*i + 10 + 10* j + 1 + k;

    std::cout << a << std::endl;
    return 0;   
}

出力する必要があります

[ [ [ 111, 112, 113] , [ 121, 122, 123] , [ 131, 132, 133] ] , [ [ 211, 212, 213
] , [ 221, 222, 223] , [ 231, 232, 233] ] , [ [ 311, 312, 313] , [ 321, 322, 323
] , [ 331, 332, 333] ] ]
于 2012-07-07T15:28:03.310 に答える