3

この問題には、C++について十分に理解していないことが関係していました。ヒープに配置した特定の値にアクセスしようとしていますが、アクセス方法がわかりません。私の問題では、オブジェクトのデータメンバー関数からヒープに値を配置し、別のデータメンバー関数でその値にアクセスしようとしています。問題は、方法がわからず、オンラインで例を検索したことですが、それらはすべてint main()にあり、特に必要なものではなかったため、必要なものはありませんでした。

最初のデータメンバー関数で、ヒープに送信する値を宣言します。これが私の最初のデータメンバー関数の例です。

void Grid::HeapValues()
{
    //Initializing Variable
    value = 2; //The type is already declared

    //Pointers point a type towards the Heap
    int* pValue = new int;

    //Initialize  an a value of in the Heap
    *pValue = value;
}

そしてデータメンバー関数でこれは欲しいものです:

void Grid::AccessHeap()
{
    //Extracting heap:
    int heap_value = *pValue; //*pValue does not exist in this function
    cout << heap_value; //Delays the value 2, which is found
                        //in the first data member function
}

尋ねるのはばかげていると思いますが、答えを見つけることができず、どうすればいいのかわかりません。ヒープから値に簡単な方法でアクセスする方法を知っている人はいますか?また、2つ以上のデータメンバー関数でアクセスできるようにする必要があります。

4

4 に答える 4

11

pValueは、クラスGridのメンバー変数である必要があります。

class Grid
{
  private: int* pValue;
  public: void HeapValues();
          void AccessHeap();
};

これで、メンバー変数pValueは、グリッドの任意のメンバー関数からアクセスできます。

于 2009-01-02T08:44:31.627 に答える
6

完了したら、デストラクタでポインタを削除することを忘れないでください。詳細については、次を参照してください。

于 2009-01-02T08:57:41.210 に答える
2

アーロンが言ったように、値を Grid クラスのメンバーにすることができます。この場合、int へのポインターである必要はありません。

class Grid
{
private:

    int value;

public:

    void HeapValue();
    void AccessHeap();
};

値は、インスタンス化されたオブジェクトの一部として格納されます。スタックまたはヒープで作成できますが、問題ではありません。クラスのインスタンスによって所有される組み込み型やオブジェクトなどの単純な値の場合、new を使用してそれらを割り当てる必要はありません。この方法では、Grid デストラクタで削除演算子を使用してクリーンアップすることを心配する必要はありません。所有している Grid インスタンスを適切に破棄するようにしてください ;-)

大まかに言えば、これには例外があり、C++ をさらに掘り下げて学習することになりますが、あなたの例では上記で問題ありません。

于 2009-01-02T10:33:37.583 に答える
0

なぜヒープに置きたいのですか?クラスの一部として追加すると、クラスと同じ場所、おそらくスタックまたはグローバルメモリに配置されます。おそらく、整数ポインタに可変サイズを持たせたいですか? その場合、メモリの使用が終わったら必ずメモリの割り当てを解除する必要があります。

ヒープ上のものの問題は、それを見つけることです。そのためのメカニズムを追加しない限り、名前でアクセスすることはできません。どういうわけか、アクセスするために必要なコードにその場所を伝える必要があります。この場合、Grid クラス内でのみアクセスする必要があるように見えるので、簡単です。アーロンが示すように、メンバー変数にするだけです。次のような結果になる可能性があります。

class Grid
{
protected:
    int* pVals;
public:
    Grid() pVals(NULL) { }
    ~Grid() { delete [] pVals; }
    void HeapValues() {
        pVals = new int[getHeapValuesSize()];
        pVals[0] = 1; // ...
    }
    void AccessHeap() {
        cout << pVals[0]; // ...
    }

(ちなみに、「メンバー関数」を意味するときに「データメンバー関数」というフレーズを使用しているようです。「データメンバー」とは、pValsなどのクラスのメンバーデータを指しますが、「データ」が何であるかはわかりませんメンバー関数」という意味になります。)

于 2009-01-03T14:28:46.897 に答える