11

私はC++にかなり慣れていないので、これは些細な質問かもしれません:

私のクラスには、配列であるプライベート メンバー変数があります。その配列を返す必要がありますが、それを正しく行う方法がわかりません。

class X {
    // ...
    private: double m_Array[9];
    public: double* GetArray() const { return m_Array; }
};

このコードに問題はありますか? これは、クラス メンバへのポインタを返しますよね? - このクラスのインスタンスからその配列をフェッチして (クラスの外部から) 変更すると、元のクラス メンバー配列も変更されますか? その場合、代わりに配列のコピーを返すにはどうすればよいですか?

4

3 に答える 3

11

これは、クラス メンバへのポインタを返しますよね?

ほとんど-配列の最初の要素へのポインターを返します。

このクラスのインスタンスからその配列をフェッチして (クラスの外部から) 変更すると、元のクラス メンバー配列も変更されますか?

そのとおりです。

その場合、代わりに配列のコピーを返すにはどうすればよいですか?

これを実現する最も簡単な方法は、代わりにstd::arrayorを使用することです。std::vectorそれへの参照を返す必要がありconstます-そうすれば、呼び出し元は必要のないときにコピーするコストを回避できます。例:

class X {
    std::array<double, 9> array;
public:
    std::array<double, 9> const & GetArray() const {return array;}
};

X x;
double d = x.GetArray()[5]; // read-only access, no copy

auto array = x.GetArray();  // get a copy
array[5] = 42;              // modify the copy

または、配列のサイズが固定されている場合 (例のように)、構造体に含まれる配列を返すことができますstd::array。それ以外の場合は、新しく割り当てられた配列へのポインタ (できればメモリ リークを避けるためのスマート ポインタ) を返すことができますstd::vector

于 2012-04-10T11:08:48.250 に答える
2

のコピーを返すには、 のnew配列doubleを動的に割り当て、現在の値を入力しm_Arrayて呼び出し元に返す必要があります (固有の最初の要素へのポインター)。delete[]呼び出し元は、返された配列を ing する責任があります。現状では、呼び出し元は返された配列の要素数を知りません。

これは C++ であるため、std::vector<double>代わりに a に変更することをお勧めします。これにより、コピーが処理され、呼び出し元に s の数に関する情報が提供されますdouble

于 2012-04-10T11:09:58.137 に答える
2

はい、配列を変更すると、クラス メンバーも変更されます。

c++ では、c スタイルの配列の代わりに std::vector を使用することをお勧めします。それはあなたの人生を楽にし、コードを読みやすくします。それでも配列の使用を主張する理由がある場合は、新しい配列を割り当てて、その配列へのポインターを返す必要があります。これにより、動的メモリを処理し、解放するように注意する必要があることに注意してください。

public:
  double* GetArray() {
    double* res = new double[9];
    for (int i = 0; i < 9; ++i) {
      res[i] = m_Array[i];
    }
    return res;
  }

memcpy を使用して、配列の要素をコピーすることもできます。

于 2012-04-10T11:10:34.737 に答える