0

私がこれを持っているとしましょう

#define T 10

StackOverflow *_stObject[H];

この配列を 20 に「サイズ変更」するにはどうすればよいですか? ベクトルは使えません。その 11 の位置を 20 の位置を持つポインターの別の配列にコピーする必要がありますが、この方法ではこのオブジェクトを他の関数で使用できません。

このオブジェクトはデータを格納します。いっぱいになったら、データを追加し続ける方法を見つける必要があります。

これどうやってするの?

動作していないため、ここでさらに情報があります。メソッドextendArray()を作成しましたが、r = tempを作成するとエラーが発生します

これは電卓であり、クラス Reg は、電卓で行った操作に関する情報を格納します。オブジェクト "r" には 10 個の操作が格納されており、10 個を超える操作を行う場合は、このポインターの配列を拡張する必要があります。

エラー メッセージは r = temp にあり、「Reg* [20]」から「Reg* [10]」への割り当てに互換性のない型があります

#define T 10

   class Calculator
    {
        public:
            Calculator();
            Calculator(NumComp&,NumComp&);
            ~Calculator();

            void printVisor();
            void setCalculator(const NumComp&,const NumComp&);
            void menu();
            void help();
            void clean();
            void run();
            void extendArray();

        private:
            NumComp n1, n2;
            Reg *r[T];
            int _tMax;
    };

        void Calculator::extendArray()
    {
        Reg *temp[T*2];

        for(int i = 0; i < 5; i++){
            temp[i] = new Reg;
            temp[i] = r[i];
          delete r[i];
         }

        r = temp;
        _tMax *= 2;
    }
4

3 に答える 3

1

新しい配列を作成し、ディープ コピーを実行する必要があります。

 StackOverflow * array = new StackOverFlow[(H * 2)];

 for (int i = 0; i < H; i++)
       arrary[i] = _stObject[i];

これで、元のすべてのデータを含む、元のサイズの 2 倍の配列ができました。

于 2012-11-12T20:38:32.440 に答える
0

あなたの課題/宿題がSTLコンテナを使用できないと述べている場合、次のようなことができます

#define T 10

class NumComp {
// ---
};

class Reg {
// ---
};


class Calculator
{
     public:
         Calculator();
         Calculator(NumComp&,NumComp&);
         ~Calculator();

         void printVisor();
         void setCalculator(const NumComp&,const NumComp&);
         void menu();
         void help();
         void clean();
         void run();
         void extendArray();

     private:
         NumComp n1, n2;
         Reg** r;
         int _tMax;

         void createArray();
         void cleanupArray(); 
};


Calculator::Calculator() {
    createArray();
}

Calculator::Calculator(NumComp&,NumComp&) {
    createArray();
}

Calculator::~Calculator() {
    cleanupArray();
}

void Calculator::createArray() {

    // create a pointer array
    r = new Reg*[T];

    // initialize to nulls
    for (int i = 0; i < T; i++) {
        r[i] = 0;
    }

    _tMax = T;
}

void Calculator::cleanupArray() {

    // make sure the contents of r[] are deleted by whoever allocates them
    delete [] r;
    r = 0;
}


void Calculator::extendArray()
{
    Reg** temp = new Reg*[_tMax*2];

    // copy contents of r to temp
    for(int i = 0; i < _tMax; i++) {
        temp[i] = r[i];
    }

    // initialize rest of temp
    for (int i = _tMax - 1; i < _tMax*2; i++) {
        temp[i] = 0;
    }

    // delete what was originally in r
    delete [] r;
    r = temp;

    _tMax *= 2;
}

配列を拡張する唯一の方法は、その内容をより大きな配列にコピーすることです。大きな配列を小さな配列に単純に割り当てることはできません(そのため、エラーが発生しましたincompatible types in assignment of 'Reg* [20]' to 'Reg* [10]')。ただし、任意のサイズの配列へのポインターを別の配列へのポインター (同じ型) に割り当てることができます。したがって、配列を拡張するには、最初に大きな配列を作成し、小さな配列の内容をそれにコピーし、小さな配列をクリーンアップして、大きな配列へのポインターを小さな配列に割り当てます。

于 2013-03-14T22:53:47.333 に答える
-1

を使用できない場合std::vector(これを使用するのが最も合理的です)、単純化された機能を備えた独自の「ベクトル」を作成できます。

class MyVector
{
    int size;
    int capacity;
    StackOverFlow ** data;

    public:

    MyVector() : size(0), capacity(10), data(new StackOverFlow * [10]) {}
    ~MyVector() {delete data;}

    void duplicateCapacity()
    {
        capacity *= 2;
        StackOverFlow ** tmp = new StackOverFlow * [capacity];
        for(int i=0; i<size; i++)
             tmp[i] = data[i];
        delete data; //<-- here was an error...
        data = tmp;
    }

    void add(StackOverFlow * item)
    {
        if(size == capacity)
            duplicateCapacity();
        data[size++] = item; 
    }

    StackOverFlow * get(int index) {return data[index];}
};

この基本的な機能があれば、仕事を終わらせることができます。

于 2012-11-12T22:31:54.300 に答える