Question

Ce problème impliquait que je ne sache pas assez de C ++. J'essaie d'accéder à une valeur spécifique que j'avais placée dans le tas, mais je ne sais pas comment y accéder. Dans mon problème, j'avais placé une valeur dans un segment de mémoire à partir d'une fonction de membre de données dans un objet et j'essayais d'y accéder dans une autre fonction de membre de données. Le problème, c’est que je ne sais pas comment, et j’avais cherché des exemples en ligne, mais aucun n’était ce dont j'avais besoin, car ils étaient tous dans int main () et ne correspondaient pas exactement à ce dont j'avais besoin.

Dans la première fonction de membre de données, je déclare la valeur que je veux envoyer au tas; Voici un exemple de ma première fonction de membre de données.

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;
}

Et dans la fonction de membre de données C'est ce que veulent:

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
}

Je me sens stupide de demander, mais je suis incapable de trouver les réponses et de ne pas comment. Est-ce que quelqu'un sait comment accéder à une valeur du tas d'une manière simple? Et j’en aurais besoin pour pouvoir accéder à plus de deux fonctions de membre de données.

Était-ce utile?

La solution

pValue doit être une variable membre de la classe Grid.

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

Maintenant, la variable membre pValue est accessible depuis n'importe quelle fonction membre de la grille.

Autres conseils

N'oubliez pas de supprimer votre pointeur dans le destructeur lorsque vous avez terminé. Pour plus d'informations, visitez:

Comme Aaron l'a dit, vous pouvez faire de la valeur un membre de votre classe Grid. Dans ce cas, il n’est pas nécessaire que ce soit un pointeur sur un int.

class Grid
{
private:

    int value;

public:

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

La valeur sera stockée en tant que partie de l’objet où qu’il soit instancié. Vous pouvez le faire sur la pile ou sur le tas, peu importe. Pour des valeurs simples telles que les types intégrés et les objets qui appartiendront à l'instance de la classe, il est inutile de les allouer en utilisant new. Ainsi, vous n'avez pas à vous soucier du nettoyage avec l'opérateur de suppression dans le destructeur de grille, mais assurez-vous simplement de disposer correctement de l'instance de grille propriétaire; -)

Bien sûr, il existe des exceptions à cela que vous apprendrez en approfondissant vos connaissances du C ++, mais pour votre exemple, les opérations ci-dessus seront acceptables.

Pourquoi le veux-tu sur le tas? Si vous l'ajoutez à la classe, il se trouvera au même endroit que la classe, éventuellement sur la pile ou dans la mémoire globale. Peut-être que vous voulez avoir une taille variable pour votre pointeur entier? Dans ce cas, vous devez vous assurer de libérer la mémoire lorsque vous avez terminé.

Le problème avec les choses sur le tas est de les trouver. Il n'y a pas d'accès par nom, sauf si vous ajoutez un mécanisme pour cela. D'une manière ou d'une autre, vous devez communiquer l'emplacement à tout code nécessaire pour y accéder. Dans ce cas, il semblerait que vous n’ayez besoin que d’un accès dans la classe Grid, ce qui est simple. Faites-en simplement une variable membre comme Aaron l'indique. Vous pourriez vous retrouver avec quelque chose comme:

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]; // ...
    }

(Sur une note de côté, vous semblez utiliser la phrase & "fonction de membre de données &" lorsque vous voulez dire & "fonction de membre &"; & "; Le membre de données & "; Fait référence aux données de membre d'une classe, comme pVals, mais je ne suis pas sûr de ce que &"; La fonction de membre de données & "; Voudrait dire.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top