3

次のようなヘッダー ファイルがあるとします。

# filename: header.h
class myclass
{
 public:
    int myVariable; # arbitrary member variable
    foo(); # arbitrary function
    myclass() # default constructor
}

ここで、コンストラクター [ myclass() ] を .cpp ファイルに実装したいとします。オブジェクト、int、何でも、配列を作成するようなことはできますか? そして、その配列をループして、コンストラクター定義内からすべて埋めることができますか?

私が尋ねる理由は、任意のメンバー関数 foo() がこの配列を変更できるようにしたいからです。これは問題につながります - myclass のオブジェクトを foo [ foo(myclass myclassObject) に渡していますか?

それとも、このオブジェクトの配列を foo() に渡しますか?

これに関する明確な説明をいただければ幸いです。私はこの例をできるだけ特定のケースに限定しないようにしましたが、それでも誰もが問題を理解できるように十分に説明しています。ありがとうございました!

4

2 に答える 2

1

コンストラクターは実際に配列を作成できます-問題は、コンストラクターが戻った後にその配列に何が起こるかです。

  • 合理的なアプローチは、ヒープに保存することです。つまり、配列を作成しnew[]ます。ただし、後でアクセスするには、配列へのポインターを保持する必要があります。これを行う最も簡単な方法は、ポインター オブジェクトをクラス メンバー データに追加することです。 foo()その後、そのポインターを使用して配列にアクセスできます。残念ながら、カスタム コピー コンストラクター、代入演算子、およびデストラクター (Google の 3 つのルール) またはスマート ポインターを使用して、配列の適切なコピーまたは共有と破棄を行う必要があります。

  • あなたの質問は、もちろん最も簡単な解決策である配列データメンバーだけが必要ではないことを意味します。その欠点は、コンパイル時に配列サイズを選択する必要があるのに対し、ヒープベースの配列は実行時にサイズを変更できることです。

  • スタック上に作成すると、スコープを離れ、その後アクセスできなくなります (スコープ内にある間に設定されたポインターまたは参照を介してアクセスしようとすると、未定義の動作が発生します)。

  • コンストラクターが静的配列にデータを設定することも可能ですが、明らかに配列の有効期間はクラスの単一のオブジェクト インスタンスから独立しています。配列を作成するコンストラクターについて話しましたので、おそらくこれを行いたくないでしょう。

于 2013-03-28T05:46:09.920 に答える
1

はい、コンストラクター内から配列を作成して「埋める」ことができるので、 で使用できますfoo。実際、それがコンストラクターの目的です (すべてをセットアップするため)。

配列を使用できるようにしたい場合foo()は、配列をクラス定義の一部にする必要があることに注意してください。

myclass.h

class myclass {
    private:
        int* arr; // declared on the "heap"
    public:
        foo();
        myclass(int arraySize);
};

myclass.cpp

#include "myclass.h"
#include <stdio>

myclass::myclass(int arraySize) :arr(new int[arraySize]) {}

myclass::foo() {
    // prints the elements of the array we declared earlier
    for (int i = 0; i < 5; i++) {
        std::cout << arr[i] << std::endl;
    }
}
于 2013-03-28T05:46:36.873 に答える