0

ここにC++newb。ポインタのみを使用して配列の独自の実装を作成しようとしていますが、乗り越える方法がわからない壁にぶつかりました。

私のコンストラクターはこのエラーをスローします

array.cpp:40:35: error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]

配列を初期化するときに、配列内のすべてのスペースをint用に解放したいと思います。

Array::Array(int theSize){
size = theSize;
int *arrayPointer = new int; 
int index = 0;
while(theSize > index){
  *(arrayPointer + index) = new int; //This is the trouble line.
  ++index;
 }
}

私は間違ったスタックオーバーフローを何をしていますか?

4

3 に答える 3

1

arrayPointer単一を指しますが、この行に必要なintの配列を指しません。int*

*(arrayPointer + index) = new int;

ただし、のタイプは*(arrayPointer + index)であるintため、コンパイラエラーが発生します。

の配列を割り当てるにはint

int* arrayPointer = new int[size];

これがメンバー変数を初期化することを目的としている場合は、次のようにします。

arrayPointer = new int[size];

それ以外の場合arrayPointerは、コンストラクターに対してローカルになります。クラスに動的に割り当てられたメンバーが含まれるようになったため、コピーコンストラクターと代入演算子の両方を実装するか、コピーを防止する必要があります(「三つのルール」を参照)。delete[] arrayPointerデストラクタで忘れないでください。


std::vector<int>これは学習演習ですが、言及するだけです。

于 2012-08-29T21:33:08.720 に答える
1

次のようにします。

#include <cstddef>

template <typename T>
class Array
{

public:

    T* const arrayPointer; // arrayPointer can't be reallocated
    const size_t size; // size can't change

    Array(const int theSize) : arrayPointer(new T[theSize]),
                               size(theSize) {}

    ~Array() {
        delete[] arrayPointer;
    }

private:

    Array(const Array& other) {} // forbid copy

    Array& operator= (const Array& other) {} // forbid assignment

} ;
  • なぜ使用するのtemplate <typename T>ですか?したがって、任意のタイプの配列を持つことができます。
  • なぜ使用するのnew T[ theSize ]ですか?theSizeしたがって、要素を同時に割り当てることができます。
  • なぜ使用するの: arrayPointer( new T[ theSize ])ですか?したがって、割り当てが失敗した場合(theSizeが大きいため)、オブジェクトは初期化せずに失敗します。RAIIと呼ばれています。
  • なぜ使用するのdelete [] arrayPointerですか?を使用new[]し、アレイ全体の割り当てを解除する必要があるためです。
  • なぜそれらconstの?誰かが配列のサイズを変更してフィールドの一貫性を失わないようにするため。
  • これらのプライベートメソッドは何ですか?それらはコピーを禁止しているので、誰もarray1 = array2; delete array2;、array1のarrayPointerの割り当てを解除するものを作成することはできません。

使用法(10intの配列を割り当てます:)

Array< int > arr( 10 ) ;

アクセス:

arr.arrayPointer[ 0 ] = 5 ;

arrayPointer注-範囲0..9のセルにアクセスできます。operator[]の使用を避けて使用するために、クラスに追加できarrayPointerますarr[ 0 ]

于 2012-08-29T21:41:52.280 に答える
0

あなたが言及した行は、int*をintvarに設定しようとしています=>int *を逆参照すると、intが提供されます:

*(arrayPointer + index) // is a int

とにかく、予約していないメモリ内を移動している(そしてメモリを逆参照している)。したがって、この命令を実行することにより、保護されたメモリゾーンにアクセスできます。

すべてのコンストラクターを次のように置き換えます。

Array::Array(int theSize)
{
    size = theSize;
    arrayPointer = new int[theSize]; // Replace your local var with a member one. Else you will lose your array ;)
}
于 2012-08-29T21:36:54.273 に答える