C ++ Доступ к куче - PullRequest
       21

C ++ Доступ к куче

3 голосов
/ 02 января 2009

Эта проблема заключалась в том, что я недостаточно знал 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
}

Я чувствую себя глупо, спрашивая, но я не могу найти ответы и не знаю как. Кто-нибудь знает, как получить доступ к значению из кучи простым способом? И мне нужно, чтобы он имел доступ к более чем двум функциям-членам данных.

Ответы [ 4 ]

11 голосов
/ 02 января 2009

pValue должна быть переменной-членом класса Grid.

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

Теперь переменная-член pValue доступна из любой функции-члена Grid.

6 голосов
/ 02 января 2009

Не забудьте удалить указатель в деструкторе, когда закончите. Для получения дополнительной информации посетите:

2 голосов
/ 02 января 2009

Как сказал Аарон, вы можете сделать значение членом вашего класса Grid. В этом случае, хотя нет необходимости указывать на int.

class Grid
{
private:

    int value;

public:

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

Значение будет сохранено как часть объекта, где бы оно ни создавалось. Вы можете сделать это в стеке или куче, это не имеет значения. Для простых значений, таких как встроенные типы и объекты, которые будут принадлежать экземпляру класса, нет необходимости размещать их, используя new. Таким образом, вам не нужно беспокоиться об очистке с помощью оператора delete в деструкторе Grid, просто убедитесь, что вы правильно распоряжаетесь владельцем экземпляра Grid;

Конечно, есть исключения из этого, которые вы узнаете, изучая C ++, но для вашего примера все будет в порядке.

0 голосов
/ 03 января 2009

Зачем тебе это в кучу? Если вы добавите его как часть класса, он будет находиться там же, где и класс, возможно, в стеке или в глобальной памяти. Возможно, вы хотите иметь переменный размер для вашего целочисленного указателя? В этом случае вам нужно обязательно освободить память, когда закончите.

Проблема с кучей вещей - найти ее. Нет доступа к нему по имени, если вы не добавите механизм для этого. Каким-то образом вам нужно сообщить местоположение любому коду, необходимому для доступа к нему. В этом случае, похоже, вам нужен только доступ в классе 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, но я не уверен что означает «функция-член данных».)

...