2

これは、基本的にいくつかの操作を実行したい数値の配列であるクラスです。

class MyClass {
public:
    MyClass() { //constructor
        int * array = new int[n];
        for(int i = 0; i < n; i++) {
            array[i] = i*i;
        }
    } //end constructor
    int displayIthElement(int i) {
        return array[i];
    }
}

エラー、識別子「配列」が displayIthElement 関数で定義されていません。あたかも配列配列がコンストラクター関数の外に存在するのを止めるかのようです。これは意味がありません。何が問題ですか?

どうもありがとうございました。

4

1 に答える 1

5

あたかも配列配列がコンストラクター関数の外に存在するのを止めるかのようです。これは意味がありません。

実際、それが意味のある唯一の動作です... これが言語の仕組みです。

arrayコンストラクターで宣言および定義されたローカル変数です。コンストラクターが終了すると、ポインター変数が破棄され、それが参照するメモリがリークします。orで割り当てられたメモリは、参照対象が範囲外になる前に、対応するnewornew [] を常に必要とします。いつも。deletedelete []

arrayクラスのメンバーである必要があります。あなたは学んでいるので、動的メモリ処理がどのように機能するかを理解するのは良い考えですが、将来的には、割り当てと割り当て解除を処理する安全なコンテナー (つまり、std::unique_ptrstd::vectorなど) を使用することをお勧めします。

class foo {
public:
  foo() { 
    array = new int[length];
    for(int i = 0; i < length; i++) {
      array[i] = i*i;
    }       
  }
private:
  int *array;  // when does this get deallocated?  Look up RAII
};
于 2013-02-10T21:42:13.573 に答える