Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

class Grid
{
private:

    int value;

public:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top