Вопрос
Эта проблема заключалась в том, что я недостаточно знал 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.
Другие советы
Не забудьте удалить указатель в деструкторе, когда закончите.Для получения дополнительной информации посетите:
- http://www.cplusplus.com/doc/tutorial/variables.html <-- Область видимости переменной
- http://www.cplusplus.com/doc/tutorial/pointers.html <-- Указатели
- http://www.cplusplus.com/doc/tutorial/dynamic.html <-- Динамическая память
Как сказал Аарон, вы можете сделать значение членом своего класса 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, но я не уверен, что будет означать «функция-член данных».)